On Sun, 27 Jul 2025 12:36:20 GMT, Philippe Marschall <d...@openjdk.org> wrote:

> Use `JavaLangAccess::uncheckedNewStringNoRepl` in `MemorySegment::getString` 
> to avoid byte[] allocation in the String constructor.
> 
> Fall back to the old code in the case of malformed input to get replacement 
> characters as per Javadoc API specification. The existing tests in 
> `TestStringEncoding` seem sufficient to me.
> 
> I ran the tier1 test suite and it passes.
> 
> For performance analysis I ran.
> 
>     make test 
> TEST="micro:org.openjdk.bench.java.lang.foreign.ToJavaStringTest" 
> MICRO="OPTIONS=-prof gc"
> 
> on an AMD Ryzen 7 PRO 5750GE.
> 
> These are the formatted results, the current master is the line on top, this 
> feature branch is the line below. We can see an improvement in throughput 
> driven by a reduction in allocation.
> 
> 
> Benchmark                                              (size)  Mode  Cnt     
> Score    Error   Units
> 
> ToJavaStringTest.panama_readString                          5  avgt   30    
> 18.996 ±  0.044   ns/op
> ToJavaStringTest.panama_readString                          5  avgt   30    
> 13.851 ±  0.028   ns/op
> 
> ToJavaStringTest.panama_readString                         20  avgt   30    
> 23.570 ±  0.050   ns/op
> ToJavaStringTest.panama_readString                         20  avgt   30    
> 18.401 ±  0.069   ns/op
> 
> ToJavaStringTest.panama_readString                        100  avgt   30    
> 32.094 ±  0.207   ns/op
> ToJavaStringTest.panama_readString                        100  avgt   30    
> 24.427 ±  0.112   ns/op
> 
> ToJavaStringTest.panama_readString                        200  avgt   30    
> 43.029 ±  0.185   ns/op
> ToJavaStringTest.panama_readString                        200  avgt   30    
> 31.914 ±  0.064   ns/op
> 
> ToJavaStringTest.panama_readString                        451  avgt   30    
> 81.145 ±  0.403   ns/op
> ToJavaStringTest.panama_readString                        451  avgt   30    
> 58.975 ±  0.233   ns/op
> 
> ToJavaStringTest.panama_readString:gc.alloc.rate.norm       5  avgt   30    
> 72.000 ±  0.001    B/op
> ToJavaStringTest.panama_readString:gc.alloc.rate.norm       5  avgt   30    
> 48.000 ±  0.001    B/op
> 
> ToJavaStringTest.panama_readString:gc.alloc.rate.norm      20  avgt   30   
> 104.000 ±  0.001    B/op
> ToJavaStringTest.panama_readString:gc.alloc.rate.norm      20  avgt   30    
> 64.000 ±  0.001    B/op
> 
> ToJavaStringTest.panama_readString:gc.alloc.rate.norm     100  avgt   30   
> 264.000 ±  0.001    B/op
> ToJavaStringTest.panama_readString:gc.alloc.rate.norm     100  avgt   30   
> 144.000 ±  0.001    B/op
> 
> ToJavaStringTest.panama_readString:gc.alloc.rate.norm     200  avgt ...

This optimization is not only needed within the JDK core library, but also by 
developers of basic class libraries and applications. This should be done by 
the C2 optimizer.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/26493#issuecomment-3125494530

Reply via email to