1*21943e31SAndroid Build Coastguard Worker /* 2*21943e31SAndroid Build Coastguard Worker * TestAllocSpeed 3*21943e31SAndroid Build Coastguard Worker * 4*21943e31SAndroid Build Coastguard Worker * Author: Lasse Collin <[email protected]> 5*21943e31SAndroid Build Coastguard Worker * 6*21943e31SAndroid Build Coastguard Worker * This file has been put into the public domain. 7*21943e31SAndroid Build Coastguard Worker * You can do whatever you want with this file. 8*21943e31SAndroid Build Coastguard Worker */ 9*21943e31SAndroid Build Coastguard Worker 10*21943e31SAndroid Build Coastguard Worker /* 11*21943e31SAndroid Build Coastguard Worker * Usage: 12*21943e31SAndroid Build Coastguard Worker * time java -jar build/jar/TestAllocSpeed.jar MODE ITERS THREADS < FILE 13*21943e31SAndroid Build Coastguard Worker * where 14*21943e31SAndroid Build Coastguard Worker * MODE is "true" for compression or "false" for decompression, 15*21943e31SAndroid Build Coastguard Worker * ITERS is the number of iterations to done by each thread, 16*21943e31SAndroid Build Coastguard Worker * THREADS is the number of threads, and 17*21943e31SAndroid Build Coastguard Worker * FILE is the input file (preferably tiny, but at most 1 MiB). 18*21943e31SAndroid Build Coastguard Worker * 19*21943e31SAndroid Build Coastguard Worker * Each thread has a different random seed so in compression mode each 20*21943e31SAndroid Build Coastguard Worker * thread will use different options in different order. This way the 21*21943e31SAndroid Build Coastguard Worker * ArrayCache gets more diverse load. 22*21943e31SAndroid Build Coastguard Worker * 23*21943e31SAndroid Build Coastguard Worker * Examples: 24*21943e31SAndroid Build Coastguard Worker * time java -jar build/jar/TestAllocSpeed.jar true 1000 4 < README 25*21943e31SAndroid Build Coastguard Worker * time java -jar build/jar/TestAllocSpeed.jar false 10000 4 < foo.xz 26*21943e31SAndroid Build Coastguard Worker */ 27*21943e31SAndroid Build Coastguard Worker 28*21943e31SAndroid Build Coastguard Worker import java.io.*; 29*21943e31SAndroid Build Coastguard Worker import java.util.Random; 30*21943e31SAndroid Build Coastguard Worker import org.tukaani.xz.*; 31*21943e31SAndroid Build Coastguard Worker 32*21943e31SAndroid Build Coastguard Worker class TestAllocSpeed implements Runnable { 33*21943e31SAndroid Build Coastguard Worker private static boolean compressing; 34*21943e31SAndroid Build Coastguard Worker private static int repeats; 35*21943e31SAndroid Build Coastguard Worker private static final byte[] testdata = new byte[1 << 20]; 36*21943e31SAndroid Build Coastguard Worker private static int testdataSize; 37*21943e31SAndroid Build Coastguard Worker private static volatile IOException exception = null; 38*21943e31SAndroid Build Coastguard Worker 39*21943e31SAndroid Build Coastguard Worker private final Random rng; 40*21943e31SAndroid Build Coastguard Worker TestAllocSpeed(long seed)41*21943e31SAndroid Build Coastguard Worker public TestAllocSpeed(long seed) { 42*21943e31SAndroid Build Coastguard Worker rng = new Random(seed); 43*21943e31SAndroid Build Coastguard Worker } 44*21943e31SAndroid Build Coastguard Worker compress()45*21943e31SAndroid Build Coastguard Worker private void compress() throws IOException { 46*21943e31SAndroid Build Coastguard Worker ByteArrayOutputStream byteStream = new ByteArrayOutputStream( 47*21943e31SAndroid Build Coastguard Worker testdataSize + 1024); 48*21943e31SAndroid Build Coastguard Worker LZMA2Options options = new LZMA2Options(); 49*21943e31SAndroid Build Coastguard Worker options.setDictSize(1 << (16 + rng.nextInt(6))); 50*21943e31SAndroid Build Coastguard Worker 51*21943e31SAndroid Build Coastguard Worker for (int i = 0; i < repeats; ++i) { 52*21943e31SAndroid Build Coastguard Worker XZOutputStream out = new XZOutputStream(byteStream, options); 53*21943e31SAndroid Build Coastguard Worker out.write(testdata, 0, testdataSize); 54*21943e31SAndroid Build Coastguard Worker out.finish(); 55*21943e31SAndroid Build Coastguard Worker } 56*21943e31SAndroid Build Coastguard Worker } 57*21943e31SAndroid Build Coastguard Worker decompress()58*21943e31SAndroid Build Coastguard Worker private void decompress() throws IOException { 59*21943e31SAndroid Build Coastguard Worker ByteArrayInputStream byteStream = new ByteArrayInputStream( 60*21943e31SAndroid Build Coastguard Worker testdata, 0, testdataSize); 61*21943e31SAndroid Build Coastguard Worker byte[] outbuf = new byte[8192]; 62*21943e31SAndroid Build Coastguard Worker 63*21943e31SAndroid Build Coastguard Worker for (int i = 0; i < repeats; ++i) { 64*21943e31SAndroid Build Coastguard Worker byteStream.reset(); 65*21943e31SAndroid Build Coastguard Worker XZInputStream in = new XZInputStream(byteStream); 66*21943e31SAndroid Build Coastguard Worker while (in.read(outbuf) > 0) {} 67*21943e31SAndroid Build Coastguard Worker } 68*21943e31SAndroid Build Coastguard Worker } 69*21943e31SAndroid Build Coastguard Worker run()70*21943e31SAndroid Build Coastguard Worker public void run() { 71*21943e31SAndroid Build Coastguard Worker try { 72*21943e31SAndroid Build Coastguard Worker if (compressing) { 73*21943e31SAndroid Build Coastguard Worker compress(); 74*21943e31SAndroid Build Coastguard Worker } else { 75*21943e31SAndroid Build Coastguard Worker decompress(); 76*21943e31SAndroid Build Coastguard Worker } 77*21943e31SAndroid Build Coastguard Worker } catch (IOException e) { 78*21943e31SAndroid Build Coastguard Worker exception = e; 79*21943e31SAndroid Build Coastguard Worker } 80*21943e31SAndroid Build Coastguard Worker } 81*21943e31SAndroid Build Coastguard Worker main(String[] args)82*21943e31SAndroid Build Coastguard Worker public static void main(String[] args) throws Exception { 83*21943e31SAndroid Build Coastguard Worker compressing = Boolean.parseBoolean(args[0]); 84*21943e31SAndroid Build Coastguard Worker repeats = Integer.parseInt(args[1]); 85*21943e31SAndroid Build Coastguard Worker final int threadCount = Integer.parseInt(args[2]); 86*21943e31SAndroid Build Coastguard Worker 87*21943e31SAndroid Build Coastguard Worker if (threadCount < 1 || threadCount > 64) 88*21943e31SAndroid Build Coastguard Worker throw new Exception("Thread count must be 1-64"); 89*21943e31SAndroid Build Coastguard Worker 90*21943e31SAndroid Build Coastguard Worker testdataSize = System.in.read(testdata); 91*21943e31SAndroid Build Coastguard Worker 92*21943e31SAndroid Build Coastguard Worker ArrayCache.setDefaultCache(BasicArrayCache.getInstance()); 93*21943e31SAndroid Build Coastguard Worker 94*21943e31SAndroid Build Coastguard Worker Thread[] threads = new Thread[threadCount]; 95*21943e31SAndroid Build Coastguard Worker for (int i = 0; i < threadCount; ++i) { 96*21943e31SAndroid Build Coastguard Worker threads[i] = new Thread(new TestAllocSpeed(i)); 97*21943e31SAndroid Build Coastguard Worker threads[i].start(); 98*21943e31SAndroid Build Coastguard Worker } 99*21943e31SAndroid Build Coastguard Worker 100*21943e31SAndroid Build Coastguard Worker for (int i = 0; i < threadCount; ++i) 101*21943e31SAndroid Build Coastguard Worker threads[i].join(); 102*21943e31SAndroid Build Coastguard Worker 103*21943e31SAndroid Build Coastguard Worker if (exception != null) 104*21943e31SAndroid Build Coastguard Worker throw exception; 105*21943e31SAndroid Build Coastguard Worker } 106*21943e31SAndroid Build Coastguard Worker } 107