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
