xref: /aosp_15_r20/external/xz-java/src/TestAllocSpeed.java (revision 21943e31f48dee19de75c78c0efeb8417c9a67d0)
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