/* * TestAllocSpeed * * Author: Lasse Collin * * This file has been put into the public domain. * You can do whatever you want with this file. */ /* * Usage: * time java -jar build/jar/TestAllocSpeed.jar MODE ITERS THREADS < FILE * where * MODE is "true" for compression or "false" for decompression, * ITERS is the number of iterations to done by each thread, * THREADS is the number of threads, and * FILE is the input file (preferably tiny, but at most 1 MiB). * * Each thread has a different random seed so in compression mode each * thread will use different options in different order. This way the * ArrayCache gets more diverse load. * * Examples: * time java -jar build/jar/TestAllocSpeed.jar true 1000 4 < README * time java -jar build/jar/TestAllocSpeed.jar false 10000 4 < foo.xz */ import java.io.*; import java.util.Random; import org.tukaani.xz.*; class TestAllocSpeed implements Runnable { private static boolean compressing; private static int repeats; private static final byte[] testdata = new byte[1 << 20]; private static int testdataSize; private static volatile IOException exception = null; private final Random rng; public TestAllocSpeed(long seed) { rng = new Random(seed); } private void compress() throws IOException { ByteArrayOutputStream byteStream = new ByteArrayOutputStream( testdataSize + 1024); LZMA2Options options = new LZMA2Options(); options.setDictSize(1 << (16 + rng.nextInt(6))); for (int i = 0; i < repeats; ++i) { XZOutputStream out = new XZOutputStream(byteStream, options); out.write(testdata, 0, testdataSize); out.finish(); } } private void decompress() throws IOException { ByteArrayInputStream byteStream = new ByteArrayInputStream( testdata, 0, testdataSize); byte[] outbuf = new byte[8192]; for (int i = 0; i < repeats; ++i) { byteStream.reset(); XZInputStream in = new XZInputStream(byteStream); while (in.read(outbuf) > 0) {} } } public void run() { try { if (compressing) { compress(); } else { decompress(); } } catch (IOException e) { exception = e; } } public static void main(String[] args) throws Exception { compressing = Boolean.parseBoolean(args[0]); repeats = Integer.parseInt(args[1]); final int threadCount = Integer.parseInt(args[2]); if (threadCount < 1 || threadCount > 64) throw new Exception("Thread count must be 1-64"); testdataSize = System.in.read(testdata); ArrayCache.setDefaultCache(BasicArrayCache.getInstance()); Thread[] threads = new Thread[threadCount]; for (int i = 0; i < threadCount; ++i) { threads[i] = new Thread(new TestAllocSpeed(i)); threads[i].start(); } for (int i = 0; i < threadCount; ++i) threads[i].join(); if (exception != null) throw exception; } }