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

Reply via email to