I've experimented with many different approaches to approximate the number of 
spins, both statically and dynamically, and going with ((1 << 13) | (1 << 14)) 
or, in other words 24576,  seems to have the best trade-off known by the author 
at this time.

Including benchmark results for exchanges below.


As compared to jdk21:

                                                      Base                     
Test                       
Name           Run target (exchanges) (virtual)       Score     Error         
Score      Error   Change  Unit
exchange    Linux aarch64        1000     false  335791.046 ± 101.849    
332159.281 ±  207.779   1.01x  ns/op
   p0.00                                         321536.000              
300032.000              1.02x  ns/op
   p0.50                                         335360.000              
343552.000              1.01x  ns/op
   p0.90                                         336384.000              
344064.000              1.01x  ns/op
   p0.95                                         337920.000              
345600.000              1.00x  ns/op
   p0.99                                         356352.000              
348160.000              1.04x? ns/op
   p0.999                                        413184.000              
402944.000              1.05x? ns/op
   p0.9999                                       700636.160              
706471.629              1.01x  ns/op
   p1.00                                        1060864.000             
1030144.000              1.01x  ns/op
exchange        Linux x64        1000     false  184007.923 ± 151.093    
177661.486 ±   37.691   1.04x? ns/op
   p0.00                                          54976.000              
160768.000              0.93x  ns/op
   p0.50                                         187392.000              
178432.000              1.04x? ns/op
   p0.90                                         196352.000              
182272.000              1.06x? ns/op
   p0.95                                         196608.000              
183296.000              1.05x? ns/op
   p0.99                                         198912.000              
185344.000              1.05x? ns/op
   p0.999                                        202240.000              
190208.000              1.06x? ns/op
   p0.9999                                       226521.651              
210782.899              1.15x  ns/op
   p1.00                                         785408.000              
483328.000              1.47x  ns/op
exchange   MacOSX aarch64        1000     false   97160.219 ± 115.253    
103016.295 ±  135.726   0.94x  ns/op
   p0.00                                          85504.000               
77696.000              1.09x  ns/op
   p0.50                                          87936.000              
115712.000              0.78x  ns/op
   p0.90                                         126976.000              
122112.000              1.05x  ns/op
   p0.95                                         128000.000              
122240.000              1.05x  ns/op
   p0.99                                         142592.000              
126208.000              1.13x  ns/op
   p0.999                                        190720.000              
178944.000              1.07x  ns/op
   p0.9999                                       227948.442              
200852.582              1.13x? ns/op
   p1.00                                         808960.000             
1552384.000              0.76x  ns/op
exchange      Windows x64        1000     false  184663.844 ±  51.925    
169926.786 ±  184.715   1.08x  ns/op
   p0.00                                         172544.000              
142592.000              1.15x? ns/op
   p0.50                                         182784.000              
165376.000              1.07x  ns/op
   p0.90                                         190464.000              
198656.000              1.03x  ns/op
   p0.95                                         190720.000              
204032.000              1.01x  ns/op
   p0.99                                         201216.000              
210176.000              1.04x  ns/op
   p0.999                                        245248.000              
218368.000              1.21x  ns/op
   p0.9999                                       317760.000              
234072.986              1.31x  ns/op
   p1.00                                         507392.000              
344576.000              1.23x  ns/op
exchange    Linux aarch64        1000      true  305307.031 ± 288.741    
297043.887 ± 5976.903   1.03x  ns/op
   p0.00                                         279040.000              
182272.000              1.55x  ns/op
   p0.50                                         302080.000              
299520.000              1.02x  ns/op
   p0.90                                         321024.000              
345600.000              0.96x  ns/op
   p0.95                                         328192.000              
346112.000              0.97x  ns/op
   p0.99                                         350720.000              
351232.000              1.00x  ns/op
   p0.999                                        436652.032              
402944.000              1.12x  ns/op
   p0.9999                                       730051.379              
732653.978              0.10x  ns/op
   p1.00                                        4300800.000           
147587072.000              0.05x  ns/op
exchange        Linux x64        1000      true  172671.278 ± 122.471    
165811.609 ±  136.381   1.04x  ns/op
   p0.00                                         156928.000              
117632.000              1.23x? ns/op
   p0.50                                         175616.000              
164352.000              1.04x? ns/op
   p0.90                                         178688.000              
178688.000              1.00x  ns/op
   p0.95                                         179712.000              
198912.000              1.00x  ns/op
   p0.99                                         181760.000              
203520.000              1.00x  ns/op
   p0.999                                        185088.000              
208384.000              0.98x  ns/op
   p0.9999                                       201445.043              
226903.552              0.84x  ns/op
   p1.00                                        4874240.000             
2502656.000              0.98x  ns/op
exchange   MacOSX aarch64        1000      true  108944.850 ± 198.374     
84552.808 ±   51.378   1.29x  ns/op
   p0.00                                          87040.000               
77440.000              1.10x  ns/op
   p0.50                                          94080.000               
83200.000              1.13x  ns/op
   p0.90                                         136192.000               
86016.000              1.61x  ns/op
   p0.95                                         175104.000               
86656.000              2.04x  ns/op
   p0.99                                         218624.000              
124800.000              1.76x  ns/op
   p0.999                                        265728.000              
150088.448              1.77x  ns/op
   p0.9999                                       347703.091              
190580.890              1.78x  ns/op
   p1.00                                         525312.000             
1574912.000              0.73x  ns/op
exchange      Windows x64        1000      true  192582.313 ±  85.915    
182865.879 ±  168.883   1.05x? ns/op
   p0.00                                         171776.000              
147456.000              1.09x? ns/op
   p0.50                                         194304.000              
183552.000              1.07x? ns/op
   p0.90                                         204288.000              
197376.000              1.02x  ns/op
   p0.95                                         205056.000              
201984.000              1.00x  ns/op
   p0.99                                         211200.000              
208384.000              1.02x  ns/op
   p0.999                                        247984.384              
216576.000              1.15x  ns/op
   p0.9999                                       325155.277              
266089.984              1.12x  ns/op
   p1.00                                         407040.000             
4898816.000              0.28x  ns/op
  ? = borderline (0.01 <= p < 0.1); blue = improvement; red = regression


As compared to mainline:

                                                      Base                      
Test                       
Name           Run target (exchanges) (virtual)       Score       Error         
Score      Error    Change  Unit
exchange    Linux aarch64        1000     false  329691.911 ±   225.591    
332159.281 ±  207.779    0.99x  ns/op
   p0.00                                         304640.000                
300032.000               0.98x  ns/op
   p0.50                                         322560.000                
343552.000               0.99x  ns/op
   p0.90                                         359936.000                
344064.000               1.01x  ns/op
   p0.95                                         360448.000                
345600.000               1.01x  ns/op
   p0.99                                         364544.000                
348160.000               1.02x  ns/op
   p0.999                                        424796.160                
402944.000               1.04x  ns/op
   p0.9999                                       654000.128                
706471.629               1.02x  ns/op
   p1.00                                        1374208.000               
1030144.000               1.05x  ns/op
exchange        Linux x64        1000     false  173515.914 ±   116.224    
177661.486 ±   37.691    0.98x  ns/op
   p0.00                                          51072.000                
160768.000               0.74x  ns/op
   p0.50                                         175104.000                
178432.000               0.97x  ns/op
   p0.90                                         186368.000                
182272.000               1.00x  ns/op
   p0.95                                         187648.000                
183296.000               1.00x  ns/op
   p0.99                                         189696.000                
185344.000               1.01x  ns/op
   p0.999                                        192512.000                
190208.000               1.00x  ns/op
   p0.9999                                       214016.000                
210782.899               0.98x  ns/op
   p1.00                                        2269184.000                
483328.000               2.93x  ns/op
exchange   MacOSX aarch64        1000     false 1836259.661 ±  4259.901    
103016.295 ±  135.726   17.82x  ns/op
   p0.00                                          87424.000                 
77696.000               1.74x? ns/op
   p0.50                                        1830912.000                
115712.000              16.14x  ns/op
   p0.90                                        1943552.000                
122112.000              16.03x  ns/op
   p0.95                                        1986560.000                
122240.000              16.32x  ns/op
   p0.99                                        2097152.000                
126208.000              16.69x  ns/op
   p0.999                                       2414325.760                
178944.000              13.57x  ns/op
   p0.9999                                      2832971.776                
200852.582              13.07x  ns/op
   p1.00                                        2834432.000               
1552384.000               4.82x  ns/op
exchange      Windows x64        1000     false  200129.575 ±   250.368    
169926.786 ±  184.715    1.17x? ns/op
   p0.00                                         160768.000                
142592.000               1.11x  ns/op
   p0.50                                         208128.000                
165376.000               1.17x? ns/op
   p0.90                                         222720.000                
198656.000               1.18x? ns/op
   p0.95                                         226560.000                
204032.000               1.18x? ns/op
   p0.99                                         234240.000                
210176.000               1.19x  ns/op
   p0.999                                        251392.000                
218368.000               1.22x  ns/op
   p0.9999                                       275604.787                
234072.986               1.19x? ns/op
   p1.00                                        4972544.000                
344576.000               4.87x  ns/op
exchange    Linux aarch64        1000      true  320774.704 ±   279.837    
297043.887 ± 5976.903    1.08x? ns/op
   p0.00                                         274944.000                
182272.000               1.56x  ns/op
   p0.50                                         318976.000                
299520.000               1.09x  ns/op
   p0.90                                         339456.000                
345600.000               1.01x  ns/op
   p0.95                                         339968.000                
346112.000               1.01x  ns/op
   p0.99                                         361472.000                
351232.000               1.03x  ns/op
   p0.999                                        431030.272                
402944.000               1.09x? ns/op
   p0.9999                                       651365.990                
732653.978               0.07x  ns/op
   p1.00                                        4481024.000             
147587072.000               0.05x  ns/op
exchange        Linux x64        1000      true  166332.785 ±   154.404    
165811.609 ±  136.381    1.00x  ns/op
   p0.00                                          53312.000                
117632.000               0.84x  ns/op
   p0.50                                         168448.000                
164352.000               1.02x  ns/op
   p0.90                                         185088.000                
178688.000               1.00x  ns/op
   p0.95                                         187136.000                
198912.000               0.99x  ns/op
   p0.99                                         189952.000                
203520.000               0.99x  ns/op
   p0.999                                        192512.000                
208384.000               0.97x  ns/op
   p0.9999                                       203460.659                
226903.552               0.84x  ns/op
   p1.00                                         377344.000               
2502656.000               0.21x  ns/op
exchange   MacOSX aarch64        1000      true 1979030.192 ± 29860.479     
84552.808 ±   51.378   23.51x  ns/op
   p0.00                                          78336.000                 
77440.000               1.03x  ns/op
   p0.50                                        2703360.000                 
83200.000              31.07x  ns/op
   p0.90                                        2785280.000                 
86016.000              32.98x  ns/op
   p0.95                                        2797568.000                 
86656.000              32.45x  ns/op
   p0.99                                        2822144.000                
124800.000              22.66x  ns/op
   p0.999                                       2985984.000                
150088.448              20.01x  ns/op
   p0.9999                                      4121049.498                
190580.890              18.56x  ns/op
   p1.00                                        4186112.000               
1574912.000               5.93x  ns/op
exchange      Windows x64        1000      true  181177.201 ±   221.793    
182865.879 ±  168.883    0.99x  ns/op
   p0.00                                         161792.000                
147456.000               1.00x  ns/op
   p0.50                                         180480.000                
183552.000               1.00x  ns/op
   p0.90                                         195328.000                
197376.000               0.99x  ns/op
   p0.95                                         199680.000                
201984.000               0.99x  ns/op
   p0.99                                         211968.000                
208384.000               1.02x  ns/op
   p0.999                                        226304.000                
216576.000               1.04x? ns/op
   p0.9999                                       279600.640                
266089.984               1.03x  ns/op
   p1.00                                        5029888.000               
4898816.000               1.78x  ns/op
  ? = borderline (0.01 <= p < 0.1); blue = improvement; red = regression



---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

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

Commit messages:
 - 8391552 - increasing the number of spins in Exchanger to amortize the cost 
of park+unpark

Changes: https://git.openjdk.org/jdk/pull/32886/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=32886&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8391552
  Stats: 1 line in 1 file changed: 0 ins; 0 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/32886.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/32886/head:pull/32886

PR: https://git.openjdk.org/jdk/pull/32886

Reply via email to