quantranhong1999 commented on PR #2770: URL: https://github.com/apache/james-project/pull/2770#issuecomment-3102123951
I am doing some JMH to compare Blake3 to SHA256. But the blake3 result (on Java libraries) is worse than the current SHA256 hashing, thus the PR is in draft state. I used 3 Java libraries that supports Blake3 in my JMH: Apache Common (current lib used in this PR), Bouncy Castle, and [Scala Blake 3](https://github.com/kcrypt/scala-blake3). JMH setup: ```java @Test public void launchBenchmark() throws Exception { Options opt = new OptionsBuilder() .include(this.getClass().getName() + ".measure*") .mode(Mode.SampleTime) .addProfiler(GCProfiler.class) .timeUnit(TimeUnit.MICROSECONDS) .warmupTime(TimeValue.seconds(5)) .warmupIterations(2) .measurementTime(TimeValue.seconds(5)) .measurementIterations(5) .threads(4) .forks(1) .shouldFailOnError(true) .shouldDoGC(true) .build(); new Runner(opt).run(); } @Benchmark public void measure_hashing_blake3_apache_common() { // https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/Blake3.html Blake3.initHash().update(ELEVEN_KILOBYTES).doFinalize(16); } @Benchmark public void measure_hashing_blake3_bouncy_castle() { // https://downloads.bouncycastle.org/java/docs/bcprov-jdk14-javadoc/org/bouncycastle/crypto/digests/Blake3Digest.html byte[] output = new byte[16]; // 128-bit digest Blake3Digest blake3Digest = new Blake3Digest(128); blake3Digest.update(ELEVEN_KILOBYTES, 0, ELEVEN_KILOBYTES.length); blake3Digest.doFinal(output, 0); } @Benchmark public void measure_hashing_blake3_scala_blake3() { // https://github.com/kcrypt/scala-blake3 byte[] output = new byte[16]; // 128-bit digest pt.kcry.blake3.Blake3.newHasher().update(ELEVEN_KILOBYTES).done(output); } @Benchmark public void measure_hashing_sha256() { Hashing.sha256().hashBytes(ELEVEN_KILOBYTES).asBytes(); } ``` Result: ```java Benchmark Mode Cnt Score Error Units MemoryBlobStoreTest.measure_hashing_blake3_apache_common sample 552991 180.804 ± 2.772 us/op MemoryBlobStoreTest.measure_hashing_blake3_apache_common:gc.alloc.rate sample 5 842.119 ± 732.480 MB/sec MemoryBlobStoreTest.measure_hashing_blake3_apache_common:gc.alloc.rate.norm sample 5 40053.993 ± 21.755 B/op MemoryBlobStoreTest.measure_hashing_blake3_apache_common:gc.count sample 5 32.000 counts MemoryBlobStoreTest.measure_hashing_blake3_apache_common:gc.time sample 5 44.000 ms MemoryBlobStoreTest.measure_hashing_blake3_apache_common:p0.00 sample 34.176 us/op MemoryBlobStoreTest.measure_hashing_blake3_apache_common:p0.50 sample 138.496 us/op MemoryBlobStoreTest.measure_hashing_blake3_apache_common:p0.90 sample 173.568 us/op MemoryBlobStoreTest.measure_hashing_blake3_apache_common:p0.95 sample 357.888 us/op MemoryBlobStoreTest.measure_hashing_blake3_apache_common:p0.99 sample 833.536 us/op MemoryBlobStoreTest.measure_hashing_blake3_apache_common:p0.999 sample 5341.250 us/op MemoryBlobStoreTest.measure_hashing_blake3_apache_common:p0.9999 sample 25716.431 us/op MemoryBlobStoreTest.measure_hashing_blake3_apache_common:p1.00 sample 129499.136 us/op MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle sample 874642 114.237 ± 0.354 us/op MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle:gc.alloc.rate sample 5 35.387 ± 13.414 MB/sec MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle:gc.alloc.rate.norm sample 5 1062.509 ± 6.770 B/op MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle:gc.count sample 5 ≈ 0 counts MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle:p0.00 sample 52.800 us/op MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle:p0.50 sample 101.888 us/op MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle:p0.90 sample 121.856 us/op MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle:p0.95 sample 136.704 us/op MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle:p0.99 sample 391.680 us/op MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle:p0.999 sample 1323.008 us/op MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle:p0.9999 sample 3381.394 us/op MemoryBlobStoreTest.measure_hashing_blake3_bouncy_castle:p1.00 sample 20283.392 us/op MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3 sample 1557152 51.557 ± 0.288 us/op MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:gc.alloc.rate sample 5 379.618 ± 99.400 MB/sec MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:gc.alloc.rate.norm sample 5 5043.500 ± 3.057 B/op MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:gc.count sample 5 12.000 counts MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:gc.time sample 5 20.000 ms MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:p0.00 sample 22.656 us/op MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:p0.50 sample 44.928 us/op MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:p0.90 sample 48.832 us/op MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:p0.95 sample 68.480 us/op MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:p0.99 sample 210.176 us/op MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:p0.999 sample 623.616 us/op MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:p0.9999 sample 4578.133 us/op MemoryBlobStoreTest.measure_hashing_blake3_scala_blake3:p1.00 sample 26345.472 us/op MemoryBlobStoreTest.measure_hashing_sha256 sample 2430830 5.222 ± 0.019 us/op MemoryBlobStoreTest.measure_hashing_sha256:gc.alloc.rate sample 5 331.547 ± 30.856 MB/sec MemoryBlobStoreTest.measure_hashing_sha256:gc.alloc.rate.norm sample 5 448.269 ± 0.206 B/op MemoryBlobStoreTest.measure_hashing_sha256:gc.count sample 5 10.000 counts MemoryBlobStoreTest.measure_hashing_sha256:gc.time sample 5 12.000 ms MemoryBlobStoreTest.measure_hashing_sha256:p0.00 sample 4.624 us/op MemoryBlobStoreTest.measure_hashing_sha256:p0.50 sample 4.952 us/op MemoryBlobStoreTest.measure_hashing_sha256:p0.90 sample 5.120 us/op MemoryBlobStoreTest.measure_hashing_sha256:p0.95 sample 5.328 us/op MemoryBlobStoreTest.measure_hashing_sha256:p0.99 sample 9.664 us/op MemoryBlobStoreTest.measure_hashing_sha256:p0.999 sample 32.576 us/op MemoryBlobStoreTest.measure_hashing_sha256:p0.9999 sample 171.499 us/op MemoryBlobStoreTest.measure_hashing_sha256:p1.00 sample 6193.152 us/op ``` The result ordering in terms of performance (response time, throughput, memory allocation pressure onto GC): Current SHA256 > Scala Blake 3 > Bouncy Castle > Apache Common. Blake3 claimed to be faster than SHA256. I do not fully understand why it is slower than SHA256 in our Java case. My guess is that Java code does not access CPU instructions directly like other languages e.g. C or Rust ...(Blake3 seems to rely on deeply on SIMD instructions). -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org