From cba107369a33b041146a2c919c2727915c2abd20 Mon Sep 17 00:00:00 2001 From: rafambn Date: Wed, 9 Sep 2026 01:13:53 -0300 Subject: [PATCH 1/2] Retain useful distant three-byte matches --- .../kflate/algorithm/FlateAlgorithms.kt | 3 - performance/2026-09-09-triples/RESULTS.md | 75 ++++ .../2026-09-09-triples/RatioSweep.java | 37 ++ performance/2026-09-09-triples/after-jmh.json | 380 ++++++++++++++++++ .../2026-09-09-triples/after-sizes.jsonl | 70 ++++ .../2026-09-09-triples/before-jmh.json | 380 ++++++++++++++++++ .../2026-09-09-triples/before-sizes.jsonl | 70 ++++ .../2026-09-09-triples/source-sha256.json | 3 + 8 files changed, 1015 insertions(+), 3 deletions(-) create mode 100644 performance/2026-09-09-triples/RESULTS.md create mode 100644 performance/2026-09-09-triples/RatioSweep.java create mode 100644 performance/2026-09-09-triples/after-jmh.json create mode 100644 performance/2026-09-09-triples/after-sizes.jsonl create mode 100644 performance/2026-09-09-triples/before-jmh.json create mode 100644 performance/2026-09-09-triples/before-sizes.jsonl create mode 100644 performance/2026-09-09-triples/source-sha256.json diff --git a/kflate/src/commonMain/kotlin/com/rafambn/kflate/algorithm/FlateAlgorithms.kt b/kflate/src/commonMain/kotlin/com/rafambn/kflate/algorithm/FlateAlgorithms.kt index d37b6dc..5e9c3ff 100644 --- a/kflate/src/commonMain/kotlin/com/rafambn/kflate/algorithm/FlateAlgorithms.kt +++ b/kflate/src/commonMain/kotlin/com/rafambn/kflate/algorithm/FlateAlgorithms.kt @@ -836,12 +836,9 @@ private fun findLongestMatch( distance += (currentIndex - candidateIndex) and MATCH_DISTANCE_MASK } - // The extra distance bits make a far three-byte match costlier than three literals in most blocks. - if (bestLength == 3 && bestDistance > MAX_DISTANCE_FOR_THREE_BYTE_MATCH) return 0 return (bestLength shl MATCH_DISTANCE_BITS) or bestDistance } internal const val MATCH_DISTANCE_BITS = 15 internal const val MATCH_DISTANCE_MASK = 32767 private const val MAX_MATCH_LENGTH = 258 -private const val MAX_DISTANCE_FOR_THREE_BYTE_MATCH = 4096 diff --git a/performance/2026-09-09-triples/RESULTS.md b/performance/2026-09-09-triples/RESULTS.md new file mode 100644 index 0000000..dd5728f --- /dev/null +++ b/performance/2026-09-09-triples/RESULTS.md @@ -0,0 +1,75 @@ +# Retain useful distant three-byte matches + +Remove the unconditional rejection of three-byte matches beyond distance 4096. The resulting size tradeoff favors the image fixtures: total level-6 output falls 4.04%, while text grows 0.29% and map data grows 0.94%. Level 9 still evaluates match choices through its cost-aware parser. + +Base: `fe2ff51`, `dev-1.1.0`. Measured on September 9, 2026 on Linux x86_64, Intel Core i7-11800H. JVM uses JBR 17.0.14; Node uses 22.22.1. + +Only KFlate was timed. Kompress sizes and timings come unchanged from the trusted September 8 archive in `performance/history.json`. Benchmark setup may produce Kompress streams for decoder validation outside timing. + +## Compressed size + +The JVM sweep compresses all seven tracked corpora at every listed level. Every output must round-trip through both the JDK RAW inflater and KFlate. Byte counts are deterministic. Single-run durations in the sweep JSON are diagnostic, not throughput benchmarks. + +Output reduction is `(beforeBytes - afterBytes) / beforeBytes`. Totals weight each corpus by its compressed bytes; they are not averages of percentage changes. + +| Level | Before bytes | After bytes | Output reduction | +| ---: | ---: | ---: | ---: | +| 0 | 76,379,868 | 76,379,868 | 0.0000% | +| 1 | 40,222,941 | 39,994,240 | 0.5686% | +| 2 | 39,269,936 | 38,612,535 | 1.6741% | +| 3 | 38,906,551 | 38,282,975 | 1.6028% | +| 4 | 38,333,169 | 37,242,461 | 2.8453% | +| 5 | 38,293,272 | 37,216,184 | 2.8127% | +| 6 | 37,882,044 | 36,351,301 | 4.0408% | +| 7 | 37,868,330 | 36,337,601 | 4.0422% | +| 8 | 37,737,043 | 35,867,468 | 4.9542% | +| 9 | 37,251,418 | 36,334,651 | 2.4610% | + +### Level 6 + +| Corpus | Before bytes | After bytes | Reduction | Saved JVM Kompress bytes | +| --- | ---: | ---: | ---: | ---: | +| simpleText | 84 | 84 | 0.0000% | 84 | +| text | 506,455 | 507,907 | -0.2867% | 505,318 | +| model3D | 2,153 | 2,153 | 0.0000% | 2,149 | +| Rainier.bmp | 3,283,450 | 3,194,187 | 2.7186% | 3,275,337 | +| Maltese.bmp | 7,158,472 | 6,752,861 | 5.6662% | 7,096,685 | +| Sunrise.bmp | 26,838,825 | 25,800,631 | 3.8683% | 26,698,992 | +| compressed_MVT.pbf | 92,605 | 93,478 | -0.9427% | 91,408 | + +### Level 9 + +| Corpus | Before bytes | After bytes | Reduction | Saved JVM Kompress bytes | +| --- | ---: | ---: | ---: | ---: | +| simpleText | 84 | 84 | 0.0000% | 84 | +| text | 492,523 | 492,576 | -0.0108% | 503,400 | +| model3D | 2,153 | 2,153 | 0.0000% | 2,149 | +| Rainier.bmp | 3,258,570 | 3,157,457 | 3.1030% | 3,270,382 | +| Maltese.bmp | 7,034,092 | 6,610,727 | 6.0188% | 7,090,887 | +| Sunrise.bmp | 26,372,269 | 25,979,422 | 1.4896% | 26,652,810 | +| compressed_MVT.pbf | 91,727 | 92,232 | -0.5505% | 91,400 | + +## Compression timing + +Development measurements use three one-second warmups and five one-second measurement iterations. JVM has one fresh fork per corpus; Native has one process per corpus; Wasm uses one runner. These shorter runs detect broad tradeoffs and are not release-grade speed claims. Raw samples, errors and confidence intervals are retained. No decompression speed claim is made. + +### jvm + +| Corpus | Before ms | After ms | Before/after speedup | Saved Kompress/after speedup | +| --- | ---: | ---: | ---: | ---: | +| simpleText | 0.0279 | 0.0270 | 1.034x | 0.158x | +| text | 60.4159 | 77.4568 | 0.780x | 0.673x | +| model3D | 0.0669 | 0.0635 | 1.052x | 0.475x | +| Rainier.bmp | 108.3289 | 129.3832 | 0.837x | 0.797x | +| Maltese.bmp | 477.9739 | 454.0345 | 1.053x | 0.832x | +| Sunrise.bmp | 1673.0244 | 1429.8168 | 1.170x | 0.865x | +| compressed_MVT.pbf | 4.5006 | 3.9631 | 1.136x | 0.985x | + + +## Validation and reproduction + +All 177 JVM tests passed on Linux. All 70 corpus/level outputs passed KFlate round trips and JDK RAW inflater interoperability checks. The timings above measure JVM compression only; they do not establish Native or Wasm speed effects. + +Build with `./gradlew :kflate:jvmTest :kflate:jvmBenchmarkBenchmarkJar`. Compile and run `RatioSweep.java` against the main classes and benchmark JAR with `kflate/src/jvmTest/resources` as its argument. JMH used filter `.*CompressionBenchmarks.rawDeflateCompression`, `-wi 3 -i 5 -w 1s -r 1s -f 1 -foe true -rf json`, and main/benchmark classes plus the generated JMH JAR on its classpath. + +Measurements ran before committing the same implementation and report. The measured algorithm source is identified by `source-sha256.json`. diff --git a/performance/2026-09-09-triples/RatioSweep.java b/performance/2026-09-09-triples/RatioSweep.java new file mode 100644 index 0000000..996a4ce --- /dev/null +++ b/performance/2026-09-09-triples/RatioSweep.java @@ -0,0 +1,37 @@ +import com.rafambn.kflate.KFlate; +import com.rafambn.kflate.compression.Raw; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.zip.Inflater; + +public class RatioSweep { + public static void main(String[] args) throws Exception { + String[] names = {"simpleText", "text", "model3D", "Rainier.bmp", "Maltese.bmp", "Sunrise.bmp", "compressed_MVT.pbf"}; + int first = args.length > 1 ? Integer.parseInt(args[1]) : 0; + int last = args.length > 2 ? Integer.parseInt(args[2]) : 9; + for (String name : names) { + byte[] input = Files.readAllBytes(Path.of(args[0], name)); + for (int level = first; level <= last; level++) { + long start = System.nanoTime(); + byte[] output = KFlate.INSTANCE.compress(input, new Raw(level, null)); + double ms = (System.nanoTime() - start) / 1e6; + Inflater inflater = new Inflater(true); + try { + inflater.setInput(output); + byte[] decoded = new byte[input.length + 1]; + int count = inflater.inflate(decoded); + if (!inflater.finished() || count != input.length || !Arrays.equals(input, Arrays.copyOf(decoded, count))) { + throw new AssertionError("Invalid output: " + name + " level " + level); + } + } finally { + inflater.end(); + } + if (!Arrays.equals(input, KFlate.INSTANCE.decompress(output, new com.rafambn.kflate.decompression.Raw(null, null)))) { + throw new AssertionError("KFlate round trip: " + name + " level " + level); + } + System.out.printf(java.util.Locale.ROOT, "{\"corpus\":\"%s\",\"level\":%d,\"originalSizeBytes\":%d,\"compressedSizeBytes\":%d,\"singleRunMs\":%.6f}%n", name, level, input.length, output.length, ms); + } + } + } +} diff --git a/performance/2026-09-09-triples/after-jmh.json b/performance/2026-09-09-triples/after-jmh.json new file mode 100644 index 0000000..02bc85b --- /dev/null +++ b/performance/2026-09-09-triples/after-jmh.json @@ -0,0 +1,380 @@ +[ + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "simpleText" + }, + "primaryMetric" : { + "score" : 2.695743642297145E-5, + "scoreError" : 3.161417630595248E-6, + "scoreConfidence" : [ + 2.3796018792376205E-5, + 3.0118854053566697E-5 + ], + "scorePercentiles" : { + "0.0" : 2.6007861507657903E-5, + "50.0" : 2.7515449158138E-5, + "90.0" : 2.7609737798144878E-5, + "95.0" : 2.7609737798144878E-5, + "99.0" : 2.7609737798144878E-5, + "99.9" : 2.7609737798144878E-5, + "99.99" : 2.7609737798144878E-5, + "99.999" : 2.7609737798144878E-5, + "99.9999" : 2.7609737798144878E-5, + "100.0" : 2.7609737798144878E-5 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 2.7609737798144878E-5, + 2.7542493335536463E-5, + 2.7515449158138E-5, + 2.6007861507657903E-5, + 2.6111640315379997E-5 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "text" + }, + "primaryMetric" : { + "score" : 0.07745679213846154, + "scoreError" : 9.521423567619446E-4, + "scoreConfidence" : [ + 0.0765046497816996, + 0.07840893449522349 + ], + "scorePercentiles" : { + "0.0" : 0.07713304115384616, + "50.0" : 0.07760306784615384, + "90.0" : 0.07766236592307692, + "95.0" : 0.07766236592307692, + "99.0" : 0.07766236592307692, + "99.9" : 0.07766236592307692, + "99.99" : 0.07766236592307692, + "99.999" : 0.07766236592307692, + "99.9999" : 0.07766236592307692, + "100.0" : 0.07766236592307692 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 0.07713304115384616, + 0.07724819223076923, + 0.07763729353846154, + 0.07760306784615384, + 0.07766236592307692 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "model3D" + }, + "primaryMetric" : { + "score" : 6.353208490223375E-5, + "scoreError" : 1.2377116504524127E-6, + "scoreConfidence" : [ + 6.229437325178134E-5, + 6.476979655268616E-5 + ], + "scorePercentiles" : { + "0.0" : 6.315368051521656E-5, + "50.0" : 6.351822131199593E-5, + "90.0" : 6.404105493309431E-5, + "95.0" : 6.404105493309431E-5, + "99.0" : 6.404105493309431E-5, + "99.9" : 6.404105493309431E-5, + "99.99" : 6.404105493309431E-5, + "99.999" : 6.404105493309431E-5, + "99.9999" : 6.404105493309431E-5, + "100.0" : 6.404105493309431E-5 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 6.315368051521656E-5, + 6.342886645529486E-5, + 6.351822131199593E-5, + 6.351860129556713E-5, + 6.404105493309431E-5 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "Rainier.bmp" + }, + "primaryMetric" : { + "score" : 0.12938320402499998, + "scoreError" : 0.0013488917123765458, + "scoreConfidence" : [ + 0.12803431231262344, + 0.1307320957373765 + ], + "scorePercentiles" : { + "0.0" : 0.129051943875, + "50.0" : 0.12929422425, + "90.0" : 0.129965623875, + "95.0" : 0.129965623875, + "99.0" : 0.129965623875, + "99.9" : 0.129965623875, + "99.99" : 0.129965623875, + "99.999" : 0.129965623875, + "99.9999" : 0.129965623875, + "100.0" : 0.129965623875 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 0.129965623875, + 0.12929422425, + 0.129200051, + 0.129051943875, + 0.129404177125 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "Maltese.bmp" + }, + "primaryMetric" : { + "score" : 0.4540344982000001, + "scoreError" : 0.013673585117296076, + "scoreConfidence" : [ + 0.44036091308270403, + 0.46770808331729613 + ], + "scorePercentiles" : { + "0.0" : 0.4477692896666667, + "50.0" : 0.455285895, + "90.0" : 0.456180712, + "95.0" : 0.456180712, + "99.0" : 0.456180712, + "99.9" : 0.456180712, + "99.99" : 0.456180712, + "99.999" : 0.456180712, + "99.9999" : 0.456180712, + "100.0" : 0.456180712 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 0.456180712, + 0.456139639, + 0.455285895, + 0.4477692896666667, + 0.4547969553333333 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "Sunrise.bmp" + }, + "primaryMetric" : { + "score" : 1.429816767, + "scoreError" : 0.03960665349438827, + "scoreConfidence" : [ + 1.3902101135056117, + 1.4694234204943881 + ], + "scorePercentiles" : { + "0.0" : 1.419618023, + "50.0" : 1.428275619, + "90.0" : 1.441365003, + "95.0" : 1.441365003, + "99.0" : 1.441365003, + "99.9" : 1.441365003, + "99.99" : 1.441365003, + "99.999" : 1.441365003, + "99.9999" : 1.441365003, + "100.0" : 1.441365003 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 1.441365003, + 1.4203362, + 1.419618023, + 1.43948899, + 1.428275619 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "compressed_MVT.pbf" + }, + "primaryMetric" : { + "score" : 0.003963126091618044, + "scoreError" : 2.240460915530722E-5, + "scoreConfidence" : [ + 0.003940721482462737, + 0.003985530700773351 + ], + "scorePercentiles" : { + "0.0" : 0.003955548984189723, + "50.0" : 0.003961954442687747, + "90.0" : 0.003970841896825397, + "95.0" : 0.003970841896825397, + "99.0" : 0.003970841896825397, + "99.9" : 0.003970841896825397, + "99.99" : 0.003970841896825397, + "99.999" : 0.003970841896825397, + "99.9999" : 0.003970841896825397, + "100.0" : 0.003970841896825397 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 0.003970841896825397, + 0.003961954442687747, + 0.003955548984189723, + 0.003960764814229249, + 0.003966520320158103 + ] + ] + }, + "secondaryMetrics" : { + } + } +] diff --git a/performance/2026-09-09-triples/after-sizes.jsonl b/performance/2026-09-09-triples/after-sizes.jsonl new file mode 100644 index 0000000..141519d --- /dev/null +++ b/performance/2026-09-09-triples/after-sizes.jsonl @@ -0,0 +1,70 @@ +{"corpus":"simpleText","level":0,"originalSizeBytes":100,"compressedSizeBytes":105,"singleRunMs":17.592301} +{"corpus":"simpleText","level":1,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":9.917356} +{"corpus":"simpleText","level":2,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.335888} +{"corpus":"simpleText","level":3,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.296002} +{"corpus":"simpleText","level":4,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.287674} +{"corpus":"simpleText","level":5,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.268641} +{"corpus":"simpleText","level":6,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.217644} +{"corpus":"simpleText","level":7,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.203127} +{"corpus":"simpleText","level":8,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.197964} +{"corpus":"simpleText","level":9,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.501836} +{"corpus":"text","level":0,"originalSizeBytes":1232923,"compressedSizeBytes":1233018,"singleRunMs":4.466042} +{"corpus":"text","level":1,"originalSizeBytes":1232923,"compressedSizeBytes":605841,"singleRunMs":51.926568} +{"corpus":"text","level":2,"originalSizeBytes":1232923,"compressedSizeBytes":584963,"singleRunMs":31.939123} +{"corpus":"text","level":3,"originalSizeBytes":1232923,"compressedSizeBytes":570068,"singleRunMs":32.398060} +{"corpus":"text","level":4,"originalSizeBytes":1232923,"compressedSizeBytes":532434,"singleRunMs":49.357227} +{"corpus":"text","level":5,"originalSizeBytes":1232923,"compressedSizeBytes":523828,"singleRunMs":58.997086} +{"corpus":"text","level":6,"originalSizeBytes":1232923,"compressedSizeBytes":507907,"singleRunMs":71.435148} +{"corpus":"text","level":7,"originalSizeBytes":1232923,"compressedSizeBytes":507551,"singleRunMs":73.423804} +{"corpus":"text","level":8,"originalSizeBytes":1232923,"compressedSizeBytes":515338,"singleRunMs":78.562167} +{"corpus":"text","level":9,"originalSizeBytes":1232923,"compressedSizeBytes":492576,"singleRunMs":213.835411} +{"corpus":"model3D","level":0,"originalSizeBytes":2478,"compressedSizeBytes":2483,"singleRunMs":0.026301} +{"corpus":"model3D","level":1,"originalSizeBytes":2478,"compressedSizeBytes":2169,"singleRunMs":0.186164} +{"corpus":"model3D","level":2,"originalSizeBytes":2478,"compressedSizeBytes":2168,"singleRunMs":0.215595} +{"corpus":"model3D","level":3,"originalSizeBytes":2478,"compressedSizeBytes":2166,"singleRunMs":0.151301} +{"corpus":"model3D","level":4,"originalSizeBytes":2478,"compressedSizeBytes":2165,"singleRunMs":0.121672} +{"corpus":"model3D","level":5,"originalSizeBytes":2478,"compressedSizeBytes":2153,"singleRunMs":0.623495} +{"corpus":"model3D","level":6,"originalSizeBytes":2478,"compressedSizeBytes":2153,"singleRunMs":0.277832} +{"corpus":"model3D","level":7,"originalSizeBytes":2478,"compressedSizeBytes":2153,"singleRunMs":0.243861} +{"corpus":"model3D","level":8,"originalSizeBytes":2478,"compressedSizeBytes":2153,"singleRunMs":0.276056} +{"corpus":"model3D","level":9,"originalSizeBytes":2478,"compressedSizeBytes":2153,"singleRunMs":0.399831} +{"corpus":"Rainier.bmp","level":0,"originalSizeBytes":6220854,"compressedSizeBytes":6221329,"singleRunMs":6.526363} +{"corpus":"Rainier.bmp","level":1,"originalSizeBytes":6220854,"compressedSizeBytes":3371441,"singleRunMs":116.268521} +{"corpus":"Rainier.bmp","level":2,"originalSizeBytes":6220854,"compressedSizeBytes":3319896,"singleRunMs":101.809875} +{"corpus":"Rainier.bmp","level":3,"originalSizeBytes":6220854,"compressedSizeBytes":3308787,"singleRunMs":88.487255} +{"corpus":"Rainier.bmp","level":4,"originalSizeBytes":6220854,"compressedSizeBytes":3260836,"singleRunMs":83.855361} +{"corpus":"Rainier.bmp","level":5,"originalSizeBytes":6220854,"compressedSizeBytes":3248669,"singleRunMs":96.977140} +{"corpus":"Rainier.bmp","level":6,"originalSizeBytes":6220854,"compressedSizeBytes":3194187,"singleRunMs":97.590301} +{"corpus":"Rainier.bmp","level":7,"originalSizeBytes":6220854,"compressedSizeBytes":3192747,"singleRunMs":101.132345} +{"corpus":"Rainier.bmp","level":8,"originalSizeBytes":6220854,"compressedSizeBytes":3168001,"singleRunMs":110.764734} +{"corpus":"Rainier.bmp","level":9,"originalSizeBytes":6220854,"compressedSizeBytes":3157457,"singleRunMs":3044.935362} +{"corpus":"Maltese.bmp","level":0,"originalSizeBytes":16427390,"compressedSizeBytes":16428645,"singleRunMs":6.633012} +{"corpus":"Maltese.bmp","level":1,"originalSizeBytes":16427390,"compressedSizeBytes":8137415,"singleRunMs":246.689082} +{"corpus":"Maltese.bmp","level":2,"originalSizeBytes":16427390,"compressedSizeBytes":7384961,"singleRunMs":275.258613} +{"corpus":"Maltese.bmp","level":3,"originalSizeBytes":16427390,"compressedSizeBytes":7181885,"singleRunMs":306.783972} +{"corpus":"Maltese.bmp","level":4,"originalSizeBytes":16427390,"compressedSizeBytes":6906178,"singleRunMs":326.780596} +{"corpus":"Maltese.bmp","level":5,"originalSizeBytes":16427390,"compressedSizeBytes":6908558,"singleRunMs":422.937392} +{"corpus":"Maltese.bmp","level":6,"originalSizeBytes":16427390,"compressedSizeBytes":6752861,"singleRunMs":429.971950} +{"corpus":"Maltese.bmp","level":7,"originalSizeBytes":16427390,"compressedSizeBytes":6752088,"singleRunMs":434.187906} +{"corpus":"Maltese.bmp","level":8,"originalSizeBytes":16427390,"compressedSizeBytes":6688995,"singleRunMs":435.942018} +{"corpus":"Maltese.bmp","level":9,"originalSizeBytes":16427390,"compressedSizeBytes":6610727,"singleRunMs":1222.313390} +{"corpus":"Sunrise.bmp","level":0,"originalSizeBytes":52344054,"compressedSizeBytes":52348049,"singleRunMs":32.014685} +{"corpus":"Sunrise.bmp","level":1,"originalSizeBytes":52344054,"compressedSizeBytes":27781139,"singleRunMs":780.103368} +{"corpus":"Sunrise.bmp","level":2,"originalSizeBytes":52344054,"compressedSizeBytes":27225698,"singleRunMs":1006.953016} +{"corpus":"Sunrise.bmp","level":3,"originalSizeBytes":52344054,"compressedSizeBytes":27125401,"singleRunMs":986.051613} +{"corpus":"Sunrise.bmp","level":4,"originalSizeBytes":52344054,"compressedSizeBytes":26446840,"singleRunMs":1058.241464} +{"corpus":"Sunrise.bmp","level":5,"originalSizeBytes":52344054,"compressedSizeBytes":26439103,"singleRunMs":1276.940111} +{"corpus":"Sunrise.bmp","level":6,"originalSizeBytes":52344054,"compressedSizeBytes":25800631,"singleRunMs":1400.942625} +{"corpus":"Sunrise.bmp","level":7,"originalSizeBytes":52344054,"compressedSizeBytes":25789497,"singleRunMs":1607.606214} +{"corpus":"Sunrise.bmp","level":8,"originalSizeBytes":52344054,"compressedSizeBytes":25399362,"singleRunMs":1777.495183} +{"corpus":"Sunrise.bmp","level":9,"originalSizeBytes":52344054,"compressedSizeBytes":25979422,"singleRunMs":13430.944630} +{"corpus":"compressed_MVT.pbf","level":0,"originalSizeBytes":146224,"compressedSizeBytes":146239,"singleRunMs":0.069378} +{"corpus":"compressed_MVT.pbf","level":1,"originalSizeBytes":146224,"compressedSizeBytes":96151,"singleRunMs":2.576885} +{"corpus":"compressed_MVT.pbf","level":2,"originalSizeBytes":146224,"compressedSizeBytes":94765,"singleRunMs":2.783010} +{"corpus":"compressed_MVT.pbf","level":3,"originalSizeBytes":146224,"compressedSizeBytes":94584,"singleRunMs":2.920066} +{"corpus":"compressed_MVT.pbf","level":4,"originalSizeBytes":146224,"compressedSizeBytes":93924,"singleRunMs":3.144073} +{"corpus":"compressed_MVT.pbf","level":5,"originalSizeBytes":146224,"compressedSizeBytes":93789,"singleRunMs":3.822671} +{"corpus":"compressed_MVT.pbf","level":6,"originalSizeBytes":146224,"compressedSizeBytes":93478,"singleRunMs":3.826807} +{"corpus":"compressed_MVT.pbf","level":7,"originalSizeBytes":146224,"compressedSizeBytes":93481,"singleRunMs":3.806955} +{"corpus":"compressed_MVT.pbf","level":8,"originalSizeBytes":146224,"compressedSizeBytes":93535,"singleRunMs":4.159156} +{"corpus":"compressed_MVT.pbf","level":9,"originalSizeBytes":146224,"compressedSizeBytes":92232,"singleRunMs":8.287034} diff --git a/performance/2026-09-09-triples/before-jmh.json b/performance/2026-09-09-triples/before-jmh.json new file mode 100644 index 0000000..7615387 --- /dev/null +++ b/performance/2026-09-09-triples/before-jmh.json @@ -0,0 +1,380 @@ +[ + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "simpleText" + }, + "primaryMetric" : { + "score" : 2.7861177968744074E-5, + "scoreError" : 2.911922900505013E-6, + "scoreConfidence" : [ + 2.494925506823906E-5, + 3.077310086924909E-5 + ], + "scorePercentiles" : { + "0.0" : 2.6910095086907388E-5, + "50.0" : 2.7661463602168382E-5, + "90.0" : 2.881266400668357E-5, + "95.0" : 2.881266400668357E-5, + "99.0" : 2.881266400668357E-5, + "99.9" : 2.881266400668357E-5, + "99.99" : 2.881266400668357E-5, + "99.999" : 2.881266400668357E-5, + "99.9999" : 2.881266400668357E-5, + "100.0" : 2.881266400668357E-5 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 2.7661463602168382E-5, + 2.881266400668357E-5, + 2.8417902909586862E-5, + 2.6910095086907388E-5, + 2.750376423837417E-5 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "text" + }, + "primaryMetric" : { + "score" : 0.06041590843529412, + "scoreError" : 6.056857237638408E-4, + "scoreConfidence" : [ + 0.059810222711530275, + 0.06102159415905796 + ], + "scorePercentiles" : { + "0.0" : 0.06014622823529412, + "50.0" : 0.060454885588235294, + "90.0" : 0.060547520647058824, + "95.0" : 0.060547520647058824, + "99.0" : 0.060547520647058824, + "99.9" : 0.060547520647058824, + "99.99" : 0.060547520647058824, + "99.999" : 0.060547520647058824, + "99.9999" : 0.060547520647058824, + "100.0" : 0.060547520647058824 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 0.06014622823529412, + 0.060430179647058824, + 0.060454885588235294, + 0.060500728058823526, + 0.060547520647058824 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "model3D" + }, + "primaryMetric" : { + "score" : 6.686024726012978E-5, + "scoreError" : 4.189482418431631E-6, + "scoreConfidence" : [ + 6.267076484169815E-5, + 7.10497296785614E-5 + ], + "scorePercentiles" : { + "0.0" : 6.499838984923317E-5, + "50.0" : 6.746798745277928E-5, + "90.0" : 6.757348270503986E-5, + "95.0" : 6.757348270503986E-5, + "99.0" : 6.757348270503986E-5, + "99.9" : 6.757348270503986E-5, + "99.99" : 6.757348270503986E-5, + "99.999" : 6.757348270503986E-5, + "99.9999" : 6.757348270503986E-5, + "100.0" : 6.757348270503986E-5 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 6.757348270503986E-5, + 6.748003926595602E-5, + 6.746798745277928E-5, + 6.678133702764053E-5, + 6.499838984923317E-5 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "Rainier.bmp" + }, + "primaryMetric" : { + "score" : 0.10832889366000001, + "scoreError" : 0.0016506001920435149, + "scoreConfidence" : [ + 0.1066782934679565, + 0.10997949385204352 + ], + "scorePercentiles" : { + "0.0" : 0.1079189768, + "50.0" : 0.108242564, + "90.0" : 0.1090366517, + "95.0" : 0.1090366517, + "99.0" : 0.1090366517, + "99.9" : 0.1090366517, + "99.99" : 0.1090366517, + "99.999" : 0.1090366517, + "99.9999" : 0.1090366517, + "100.0" : 0.1090366517 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 0.1090366517, + 0.108242564, + 0.1079189768, + 0.1083576889, + 0.1080885869 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "Maltese.bmp" + }, + "primaryMetric" : { + "score" : 0.4779739153333333, + "scoreError" : 0.007987030924469857, + "scoreConfidence" : [ + 0.46998688440886344, + 0.4859609462578031 + ], + "scorePercentiles" : { + "0.0" : 0.476138847, + "50.0" : 0.477748715, + "90.0" : 0.481469577, + "95.0" : 0.481469577, + "99.0" : 0.481469577, + "99.9" : 0.481469577, + "99.99" : 0.481469577, + "99.999" : 0.481469577, + "99.9999" : 0.481469577, + "100.0" : 0.481469577 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 0.476735972, + 0.481469577, + 0.47777646566666665, + 0.477748715, + 0.476138847 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "Sunrise.bmp" + }, + "primaryMetric" : { + "score" : 1.6730243644000002, + "scoreError" : 0.07340701551445698, + "scoreConfidence" : [ + 1.5996173488855432, + 1.7464313799144573 + ], + "scorePercentiles" : { + "0.0" : 1.644701101, + "50.0" : 1.67681155, + "90.0" : 1.697225124, + "95.0" : 1.697225124, + "99.0" : 1.697225124, + "99.9" : 1.697225124, + "99.99" : 1.697225124, + "99.999" : 1.697225124, + "99.9999" : 1.697225124, + "100.0" : 1.697225124 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 1.697225124, + 1.678261324, + 1.668122723, + 1.67681155, + 1.644701101 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.37", + "benchmark" : "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs" : [ + ], + "jdkVersion" : "17.0.14", + "vmName" : "OpenJDK 64-Bit Server VM", + "vmVersion" : "17.0.14+1-b1367.22", + "warmupIterations" : 3, + "warmupTime" : "1 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "1 s", + "measurementBatchSize" : 1, + "params" : { + "corpus" : "compressed_MVT.pbf" + }, + "primaryMetric" : { + "score" : 0.00450055958947036, + "scoreError" : 5.6866598483374845E-5, + "scoreConfidence" : [ + 0.004443692990986985, + 0.004557426187953735 + ], + "scorePercentiles" : { + "0.0" : 0.004483004799107143, + "50.0" : 0.004503572950672646, + "90.0" : 0.004517674288288288, + "95.0" : 0.004517674288288288, + "99.0" : 0.004517674288288288, + "99.9" : 0.004517674288288288, + "99.99" : 0.004517674288288288, + "99.999" : 0.004517674288288288, + "99.9999" : 0.004517674288288288, + "100.0" : 0.004517674288288288 + }, + "scoreUnit" : "s/op", + "rawData" : [ + [ + 0.004503572950672646, + 0.004487895139013453, + 0.004483004799107143, + 0.00451065077027027, + 0.004517674288288288 + ] + ] + }, + "secondaryMetrics" : { + } + } +] diff --git a/performance/2026-09-09-triples/before-sizes.jsonl b/performance/2026-09-09-triples/before-sizes.jsonl new file mode 100644 index 0000000..6b0a261 --- /dev/null +++ b/performance/2026-09-09-triples/before-sizes.jsonl @@ -0,0 +1,70 @@ +{"corpus":"simpleText","level":0,"originalSizeBytes":100,"compressedSizeBytes":105,"singleRunMs":18.721607} +{"corpus":"simpleText","level":1,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":10.375607} +{"corpus":"simpleText","level":2,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.346866} +{"corpus":"simpleText","level":3,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.426491} +{"corpus":"simpleText","level":4,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.288781} +{"corpus":"simpleText","level":5,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.294199} +{"corpus":"simpleText","level":6,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.256687} +{"corpus":"simpleText","level":7,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.217747} +{"corpus":"simpleText","level":8,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.213022} +{"corpus":"simpleText","level":9,"originalSizeBytes":100,"compressedSizeBytes":84,"singleRunMs":0.510794} +{"corpus":"text","level":0,"originalSizeBytes":1232923,"compressedSizeBytes":1233018,"singleRunMs":4.634060} +{"corpus":"text","level":1,"originalSizeBytes":1232923,"compressedSizeBytes":599813,"singleRunMs":54.476717} +{"corpus":"text","level":2,"originalSizeBytes":1232923,"compressedSizeBytes":581519,"singleRunMs":33.454095} +{"corpus":"text","level":3,"originalSizeBytes":1232923,"compressedSizeBytes":565252,"singleRunMs":34.883134} +{"corpus":"text","level":4,"originalSizeBytes":1232923,"compressedSizeBytes":531466,"singleRunMs":59.907435} +{"corpus":"text","level":5,"originalSizeBytes":1232923,"compressedSizeBytes":521837,"singleRunMs":61.611316} +{"corpus":"text","level":6,"originalSizeBytes":1232923,"compressedSizeBytes":506455,"singleRunMs":76.163221} +{"corpus":"text","level":7,"originalSizeBytes":1232923,"compressedSizeBytes":506097,"singleRunMs":78.619466} +{"corpus":"text","level":8,"originalSizeBytes":1232923,"compressedSizeBytes":513489,"singleRunMs":83.872443} +{"corpus":"text","level":9,"originalSizeBytes":1232923,"compressedSizeBytes":492523,"singleRunMs":220.517381} +{"corpus":"model3D","level":0,"originalSizeBytes":2478,"compressedSizeBytes":2483,"singleRunMs":0.054391} +{"corpus":"model3D","level":1,"originalSizeBytes":2478,"compressedSizeBytes":2169,"singleRunMs":0.236631} +{"corpus":"model3D","level":2,"originalSizeBytes":2478,"compressedSizeBytes":2168,"singleRunMs":0.159924} +{"corpus":"model3D","level":3,"originalSizeBytes":2478,"compressedSizeBytes":2166,"singleRunMs":0.143489} +{"corpus":"model3D","level":4,"originalSizeBytes":2478,"compressedSizeBytes":2165,"singleRunMs":0.133548} +{"corpus":"model3D","level":5,"originalSizeBytes":2478,"compressedSizeBytes":2153,"singleRunMs":0.726203} +{"corpus":"model3D","level":6,"originalSizeBytes":2478,"compressedSizeBytes":2153,"singleRunMs":0.277670} +{"corpus":"model3D","level":7,"originalSizeBytes":2478,"compressedSizeBytes":2153,"singleRunMs":0.243557} +{"corpus":"model3D","level":8,"originalSizeBytes":2478,"compressedSizeBytes":2153,"singleRunMs":0.184029} +{"corpus":"model3D","level":9,"originalSizeBytes":2478,"compressedSizeBytes":2153,"singleRunMs":0.404074} +{"corpus":"Rainier.bmp","level":0,"originalSizeBytes":6220854,"compressedSizeBytes":6221329,"singleRunMs":4.097972} +{"corpus":"Rainier.bmp","level":1,"originalSizeBytes":6220854,"compressedSizeBytes":3387685,"singleRunMs":127.041113} +{"corpus":"Rainier.bmp","level":2,"originalSizeBytes":6220854,"compressedSizeBytes":3357387,"singleRunMs":101.260474} +{"corpus":"Rainier.bmp","level":3,"originalSizeBytes":6220854,"compressedSizeBytes":3345679,"singleRunMs":106.363578} +{"corpus":"Rainier.bmp","level":4,"originalSizeBytes":6220854,"compressedSizeBytes":3325593,"singleRunMs":100.669595} +{"corpus":"Rainier.bmp","level":5,"originalSizeBytes":6220854,"compressedSizeBytes":3313388,"singleRunMs":105.538266} +{"corpus":"Rainier.bmp","level":6,"originalSizeBytes":6220854,"compressedSizeBytes":3283450,"singleRunMs":113.997284} +{"corpus":"Rainier.bmp","level":7,"originalSizeBytes":6220854,"compressedSizeBytes":3282047,"singleRunMs":120.376039} +{"corpus":"Rainier.bmp","level":8,"originalSizeBytes":6220854,"compressedSizeBytes":3274905,"singleRunMs":118.865381} +{"corpus":"Rainier.bmp","level":9,"originalSizeBytes":6220854,"compressedSizeBytes":3258570,"singleRunMs":3625.149389} +{"corpus":"Maltese.bmp","level":0,"originalSizeBytes":16427390,"compressedSizeBytes":16428645,"singleRunMs":6.704834} +{"corpus":"Maltese.bmp","level":1,"originalSizeBytes":16427390,"compressedSizeBytes":8344362,"singleRunMs":287.839174} +{"corpus":"Maltese.bmp","level":2,"originalSizeBytes":16427390,"compressedSizeBytes":7762283,"singleRunMs":334.470960} +{"corpus":"Maltese.bmp","level":3,"originalSizeBytes":16427390,"compressedSizeBytes":7494606,"singleRunMs":371.202987} +{"corpus":"Maltese.bmp","level":4,"originalSizeBytes":16427390,"compressedSizeBytes":7272625,"singleRunMs":395.378098} +{"corpus":"Maltese.bmp","level":5,"originalSizeBytes":16427390,"compressedSizeBytes":7265831,"singleRunMs":509.528066} +{"corpus":"Maltese.bmp","level":6,"originalSizeBytes":16427390,"compressedSizeBytes":7158472,"singleRunMs":523.034253} +{"corpus":"Maltese.bmp","level":7,"originalSizeBytes":16427390,"compressedSizeBytes":7157735,"singleRunMs":526.984351} +{"corpus":"Maltese.bmp","level":8,"originalSizeBytes":16427390,"compressedSizeBytes":7125327,"singleRunMs":524.641283} +{"corpus":"Maltese.bmp","level":9,"originalSizeBytes":16427390,"compressedSizeBytes":7034092,"singleRunMs":1436.734506} +{"corpus":"Sunrise.bmp","level":0,"originalSizeBytes":52344054,"compressedSizeBytes":52348049,"singleRunMs":31.612486} +{"corpus":"Sunrise.bmp","level":1,"originalSizeBytes":52344054,"compressedSizeBytes":27793016,"singleRunMs":887.391514} +{"corpus":"Sunrise.bmp","level":2,"originalSizeBytes":52344054,"compressedSizeBytes":27471887,"singleRunMs":1064.576845} +{"corpus":"Sunrise.bmp","level":3,"originalSizeBytes":52344054,"compressedSizeBytes":27404419,"singleRunMs":1166.086238} +{"corpus":"Sunrise.bmp","level":4,"originalSizeBytes":52344054,"compressedSizeBytes":27107867,"singleRunMs":1250.581032} +{"corpus":"Sunrise.bmp","level":5,"originalSizeBytes":52344054,"compressedSizeBytes":27096750,"singleRunMs":1511.964986} +{"corpus":"Sunrise.bmp","level":6,"originalSizeBytes":52344054,"compressedSizeBytes":26838825,"singleRunMs":1479.025315} +{"corpus":"Sunrise.bmp","level":7,"originalSizeBytes":52344054,"compressedSizeBytes":26827604,"singleRunMs":1687.182227} +{"corpus":"Sunrise.bmp","level":8,"originalSizeBytes":52344054,"compressedSizeBytes":26728454,"singleRunMs":1866.351752} +{"corpus":"Sunrise.bmp","level":9,"originalSizeBytes":52344054,"compressedSizeBytes":26372269,"singleRunMs":12143.996321} +{"corpus":"compressed_MVT.pbf","level":0,"originalSizeBytes":146224,"compressedSizeBytes":146239,"singleRunMs":0.056884} +{"corpus":"compressed_MVT.pbf","level":1,"originalSizeBytes":146224,"compressedSizeBytes":95812,"singleRunMs":2.498114} +{"corpus":"compressed_MVT.pbf","level":2,"originalSizeBytes":146224,"compressedSizeBytes":94608,"singleRunMs":2.921274} +{"corpus":"compressed_MVT.pbf","level":3,"originalSizeBytes":146224,"compressedSizeBytes":94345,"singleRunMs":3.426504} +{"corpus":"compressed_MVT.pbf","level":4,"originalSizeBytes":146224,"compressedSizeBytes":93369,"singleRunMs":3.443246} +{"corpus":"compressed_MVT.pbf","level":5,"originalSizeBytes":146224,"compressedSizeBytes":93229,"singleRunMs":3.893521} +{"corpus":"compressed_MVT.pbf","level":6,"originalSizeBytes":146224,"compressedSizeBytes":92605,"singleRunMs":4.154555} +{"corpus":"compressed_MVT.pbf","level":7,"originalSizeBytes":146224,"compressedSizeBytes":92610,"singleRunMs":4.015288} +{"corpus":"compressed_MVT.pbf","level":8,"originalSizeBytes":146224,"compressedSizeBytes":92631,"singleRunMs":4.439951} +{"corpus":"compressed_MVT.pbf","level":9,"originalSizeBytes":146224,"compressedSizeBytes":91727,"singleRunMs":8.610094} diff --git a/performance/2026-09-09-triples/source-sha256.json b/performance/2026-09-09-triples/source-sha256.json new file mode 100644 index 0000000..3e2d3b7 --- /dev/null +++ b/performance/2026-09-09-triples/source-sha256.json @@ -0,0 +1,3 @@ +{ + "kflate/src/commonMain/kotlin/com/rafambn/kflate/algorithm/FlateAlgorithms.kt": "d1e3a4e96975fce63b4992df18640ff88939f113461950c97598d0a18ef56c86" +} From 8a91ffd08d345aa23b2610abe387181cae6a76bd Mon Sep 17 00:00:00 2001 From: rafambn Date: Wed, 9 Sep 2026 02:08:24 -0300 Subject: [PATCH 2/2] Document text timing variability across fresh forks --- performance/2026-09-09-triples/RESULTS.md | 4 + .../baseline-recheck-jmh.json | 200 ++++++++++++++++++ 2 files changed, 204 insertions(+) create mode 100644 performance/2026-09-09-triples/baseline-recheck-jmh.json diff --git a/performance/2026-09-09-triples/RESULTS.md b/performance/2026-09-09-triples/RESULTS.md index dd5728f..78b9d6a 100644 --- a/performance/2026-09-09-triples/RESULTS.md +++ b/performance/2026-09-09-triples/RESULTS.md @@ -73,3 +73,7 @@ All 177 JVM tests passed on Linux. All 70 corpus/level outputs passed KFlate rou Build with `./gradlew :kflate:jvmTest :kflate:jvmBenchmarkBenchmarkJar`. Compile and run `RatioSweep.java` against the main classes and benchmark JAR with `kflate/src/jvmTest/resources` as its argument. JMH used filter `.*CompressionBenchmarks.rawDeflateCompression`, `-wi 3 -i 5 -w 1s -r 1s -f 1 -foe true -rf json`, and main/benchmark classes plus the generated JMH JAR on its classpath. Measurements ran before committing the same implementation and report. The measured algorithm source is identified by `source-sha256.json`. + +## Timing calibration + +A later three-fork unchanged-baseline run measured text at 60.37, 85.43, and 64.00 ms per fork. This spread means the initial single-fork text comparison cannot establish a causal speed change. The deterministic size results are unaffected. See `baseline-recheck-jmh.json` for all samples. diff --git a/performance/2026-09-09-triples/baseline-recheck-jmh.json b/performance/2026-09-09-triples/baseline-recheck-jmh.json new file mode 100644 index 0000000..198a588 --- /dev/null +++ b/performance/2026-09-09-triples/baseline-recheck-jmh.json @@ -0,0 +1,200 @@ +[ + { + "jmhVersion": "1.37", + "benchmark": "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs": [], + "jdkVersion": "17.0.14", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.14+1-b1367.22", + "warmupIterations": 3, + "warmupTime": "1 s", + "warmupBatchSize": 1, + "measurementIterations": 5, + "measurementTime": "1 s", + "measurementBatchSize": 1, + "params": { + "corpus": "simpleText" + }, + "primaryMetric": { + "score": 2.6968305442982996e-05, + "scoreError": 7.972825660060215e-07, + "scoreConfidence": [ + 2.6171022876976976e-05, + 2.7765588008989016e-05 + ], + "scorePercentiles": { + "0.0": 2.6064190561809466e-05, + "50.0": 2.713266691080729e-05, + "90.0": 2.8003960663271567e-05, + "95.0": 2.8266364931321012e-05, + "99.0": 2.8266364931321012e-05, + "99.9": 2.8266364931321012e-05, + "99.99": 2.8266364931321012e-05, + "99.999": 2.8266364931321012e-05, + "99.9999": 2.8266364931321012e-05, + "100.0": 2.8266364931321012e-05 + }, + "scoreUnit": "s/op", + "rawData": [ + [ + 2.7555488814194403e-05, + 2.8266364931321012e-05, + 2.7460792801449593e-05, + 2.6064190561809466e-05, + 2.608264600500678e-05 + ], + [ + 2.7647624087793012e-05, + 2.7570792910499186e-05, + 2.7829024484571936e-05, + 2.63618836056932e-05, + 2.6479099994705074e-05 + ], + [ + 2.7309787188728704e-05, + 2.713266691080729e-05, + 2.618046873445884e-05, + 2.6117664142666912e-05, + 2.6466086471039612e-05 + ] + ] + }, + "secondaryMetrics": {} + }, + { + "jmhVersion": "1.37", + "benchmark": "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs": [], + "jdkVersion": "17.0.14", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.14+1-b1367.22", + "warmupIterations": 3, + "warmupTime": "1 s", + "warmupBatchSize": 1, + "measurementIterations": 5, + "measurementTime": "1 s", + "measurementBatchSize": 1, + "params": { + "corpus": "text" + }, + "primaryMetric": { + "score": 0.06993304894514706, + "scoreError": 0.012428937382961722, + "scoreConfidence": [ + 0.05750411156218534, + 0.08236198632810877 + ], + "scorePercentiles": { + "0.0": 0.060155878882352944, + "50.0": 0.0634497960625, + "90.0": 0.08588725383333333, + "95.0": 0.08624586358333333, + "99.0": 0.08624586358333333, + "99.9": 0.08624586358333333, + "99.99": 0.08624586358333333, + "99.999": 0.08624586358333333, + "99.9999": 0.08624586358333333, + "100.0": 0.08624586358333333 + }, + "scoreUnit": "s/op", + "rawData": [ + [ + 0.060155878882352944, + 0.06047350752941177, + 0.06041102294117647, + 0.06046983752941176, + 0.060362842588235294 + ], + [ + 0.08493959983333334, + 0.08484457791666666, + 0.08564818066666667, + 0.08546072075, + 0.08624586358333333 + ], + [ + 0.06015902294117647, + 0.06055583835294118, + 0.0634497960625, + 0.06794135146666666, + 0.06787769313333333 + ] + ] + }, + "secondaryMetrics": {} + }, + { + "jmhVersion": "1.37", + "benchmark": "com.rafambn.kflate.benchmark.CompressionBenchmarks.rawDeflateCompression", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/rafael/.jdks/jbr-17.0.14/bin/java", + "jvmArgs": [], + "jdkVersion": "17.0.14", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.14+1-b1367.22", + "warmupIterations": 3, + "warmupTime": "1 s", + "warmupBatchSize": 1, + "measurementIterations": 5, + "measurementTime": "1 s", + "measurementBatchSize": 1, + "params": { + "corpus": "model3D" + }, + "primaryMetric": { + "score": 6.769606591254372e-05, + "scoreError": 1.896985698416163e-06, + "scoreConfidence": [ + 6.579908021412755e-05, + 6.959305161095989e-05 + ], + "scorePercentiles": { + "0.0": 6.342663043753963e-05, + "50.0": 6.822538021828103e-05, + "90.0": 6.953005168173725e-05, + "95.0": 6.958730044531032e-05, + "99.0": 6.958730044531032e-05, + "99.9": 6.958730044531032e-05, + "99.99": 6.958730044531032e-05, + "99.999": 6.958730044531032e-05, + "99.9999": 6.958730044531032e-05, + "100.0": 6.958730044531032e-05 + }, + "scoreUnit": "s/op", + "rawData": [ + [ + 6.342663043753963e-05, + 6.413363150807899e-05, + 6.75012582669726e-05, + 6.743249794377402e-05, + 6.657319154742096e-05 + ], + [ + 6.958730044531032e-05, + 6.857982686505759e-05, + 6.836027286397813e-05, + 6.841834060747024e-05, + 6.800295553440304e-05 + ], + [ + 6.94918858393552e-05, + 6.832567481896433e-05, + 6.822538021828103e-05, + 6.918970121065376e-05, + 6.819244058089589e-05 + ] + ] + }, + "secondaryMetrics": {} + } +]