diff options
Diffstat (limited to 'java/org/brotli/integration/Benchmark.java')
-rw-r--r-- | java/org/brotli/integration/Benchmark.java | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/java/org/brotli/integration/Benchmark.java b/java/org/brotli/integration/Benchmark.java new file mode 100644 index 0000000..d44e161 --- /dev/null +++ b/java/org/brotli/integration/Benchmark.java @@ -0,0 +1,117 @@ +package org.brotli.integration; + +import org.brotli.dec.BrotliInputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; + +/** + * Measures decompression speed on the given corpus. + */ +public class Benchmark { + private static byte[] readFile(String fileName) throws IOException { + int bufferLength = 65536; + byte[] buffer = new byte[bufferLength]; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + FileInputStream fin = new FileInputStream(fileName); + try { + int bytesRead; + while ((bytesRead = fin.read(buffer)) >= 0) { + baos.write(buffer, 0, bytesRead); + } + } finally { + fin.close(); + } + return baos.toByteArray(); + } + + private static long decodeBytes(InputStream input, OutputStream output, byte[] buffer) + throws IOException { + long totalOut = 0; + int readBytes; + BrotliInputStream in = new BrotliInputStream(input); + try { + while ((readBytes = in.read(buffer)) >= 0) { + output.write(buffer, 0, readBytes); + totalOut += readBytes; + } + } finally { + in.close(); + } + return totalOut; + } + + public static void main(String... args) throws IOException { + if (args.length == 0) { + System.out.println("Usage: benchmark <corpus>"); + return; + } + File corpusDir = new File(args[0]); + ArrayList<String> fileNames = new ArrayList<String>(); + File[] filesList = corpusDir.listFiles(); + if (filesList == null) { + System.out.println("'" + args[0] + "' is not a directory"); + return; + } + for (File file : filesList) { + if (!file.isFile()) { + continue; + } + String fileName = file.getAbsolutePath(); + if (!fileName.endsWith(".brotli")) { + continue; + } + fileNames.add(fileName); + } + int fileCount = fileNames.size(); + if (fileCount == 0) { + System.out.println("No files found"); + return; + } + byte[][] files = new byte[fileCount][]; + for (int i = 0; i < fileCount; ++i) { + files[i] = readFile(fileNames.get(i)); + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(65536); + byte[] buffer = new byte[65536]; + + int warmupRepeat = 10; + long bytesDecoded = 0; + for (int i = 0; i < warmupRepeat; ++i) { + bytesDecoded = 0; + for (int j = 0; j < fileCount; ++j) { + baos.reset(); + bytesDecoded += decodeBytes(new ByteArrayInputStream(files[j]), baos, buffer); + } + } + + int repeat = 100; + + long bestTime = Long.MAX_VALUE; + for (int i = 0; i < repeat; ++i) { + long start = System.nanoTime(); + for (int j = 0; j < fileCount; ++j) { + baos.reset(); + decodeBytes(new ByteArrayInputStream(files[j]), baos, buffer); + } + long end = System.nanoTime(); + long timeDelta = end - start; + if (timeDelta < bestTime) { + bestTime = timeDelta; + } + } + + double timeDeltaSeconds = bestTime / 1000000000.0; + if (timeDeltaSeconds <= 0) { + return; + } + double mbDecoded = bytesDecoded / (1024.0 * 1024.0); + System.out.println(mbDecoded / timeDeltaSeconds); + } +} |