DulcetAirman icon

faster java output

DulcetAirman | PRO | 08/01/18 10:54:25 PM UTC | 0 ⭐ | 655 👁️ | Never ⏰ | []
Java |

1.43 KB

|

None

|

0 👍

/

0 👎

package ch.claude_martin.playground;
 
import java.io.FilterOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
 
public final class SomeClass {
    final static int[] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE };
 
    static int stringSize(int x) {
        for (int i = 0;; i++)
            if (x <= sizeTable[i])
                return i + 1;
    }
 
    static boolean increment(byte[] buf, int off) {
        if (buf[off] == 0) {
            buf[off] = '1';
            return true;
        }
        if (buf[off] == '9') {
            buf[off] = '0';
            return increment(buf, off - 1);
        }
        buf[off]++;
        return false;
    }
 
    public static void main(String... args) throws Throwable {
        final long start = System.nanoTime();
        final int n = 10000000;
        // IntStream.rangeClosed(0, lastNumber).forEach(System.out::println);
        final int size = stringSize(n);
        byte[] buf = new byte[size + 1];
        buf[size-1] = '0';
        buf[size] = '\n';
        final Field field = FilterOutputStream.class.getDeclaredField("out");
        field.setAccessible(true);
        OutputStream out = (OutputStream) field.get(System.out);
        int off = size - 1;
        final int last = size - 1; // least significant byte
 
        for (int i = 0; i < n; i++) {
            if (increment(buf, last))
                off--;
            out.write(buf, off, size - off+1 );
        }
        final long end = System.nanoTime();
        System.out.println("====");
        System.out.println(end - start);
    }
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎