Don't Sleep(1) in some spin-wait loops by kouvel · Pull Request #21722 · dotnet/coreclr (original) (raw)

With a short delay between operations (more realistic), there are mostly improvements. ConcurrentStack's Pop in particular reaches Sleep(1) very quickly and so was very unfair to begin with.

Spin                                           Left score       Right score      ∆ Score   ∆ Score %  Comment
---------------------------------------------  ---------------  ---------------  --------  ---------  ---------------
ConcurrentBagFairness 02T                      98851.58 ±0.34%  99358.90 ±0.10%    507.32      0.51%
ConcurrentBagFairness 04T                      99509.70 ±0.07%  99613.40 ±0.19%    103.69      0.10%
ConcurrentBagFairness 08T                      95944.50 ±0.96%  95945.79 ±0.82%      1.29      0.00%
ConcurrentBagFairness 16T                        533.12 ±1.31%    555.91 ±1.66%     22.79      4.28%
ConcurrentBagThroughput 02T                     5465.33 ±0.48%   5546.60 ±0.46%     81.27      1.49%  Likely improved
ConcurrentBagThroughput 04T                     8475.14 ±0.77%   8502.81 ±0.38%     27.67      0.33%
ConcurrentBagThroughput 08T                    12536.09 ±0.17%  12764.54 ±0.44%    228.45      1.82%  Improved
ConcurrentBagThroughput 16T                    12478.13 ±0.10%  12747.11 ±0.30%    268.97      2.16%  Improved
ConcurrentQueueFairness 02T                    98676.06 ±0.36%  98652.12 ±0.79%    -23.94     -0.02%
ConcurrentQueueFairness 04T                    98799.26 ±0.86%  98828.64 ±0.91%     29.39      0.03%
ConcurrentQueueFairness 08T                    19827.74 ±8.26%  65681.26 ±3.09%  45853.52    231.26%  Improved
ConcurrentQueueFairness 16T                      765.69 ±1.14%    783.43 ±1.30%     17.73      2.32%
ConcurrentQueueThroughput 02T                   5721.85 ±0.56%   5676.11 ±0.47%    -45.74     -0.80%
ConcurrentQueueThroughput 04T                   7590.31 ±0.25%   7651.99 ±0.10%     61.69      0.81%  Likely improved
ConcurrentQueueThroughput 08T                   8957.50 ±0.78%   9065.22 ±0.25%    107.71      1.20%
ConcurrentQueueThroughput 16T                   9310.72 ±0.60%   9236.79 ±0.77%    -73.93     -0.79%
ConcurrentStackFairness 02T                    96485.08 ±0.23%  96877.09 ±0.23%    392.01      0.41%
ConcurrentStackFairness 04T                      576.30 ±2.07%  79495.05 ±0.14%  78918.75  13693.95%  Improved
ConcurrentStackFairness 08T                      379.10 ±0.88%  48063.94 ±0.30%  47684.84  12578.40%  Improved
ConcurrentStackFairness 16T                      223.52 ±0.71%  10238.24 ±0.19%  10014.71   4480.37%  Improved
ConcurrentStackThroughput 02T                   4993.09 ±0.43%   5574.10 ±0.27%    581.01     11.64%  Improved
ConcurrentStackThroughput 04T                   5220.53 ±0.49%   6149.84 ±0.12%    929.32     17.80%  Improved
ConcurrentStackThroughput 08T                   5448.92 ±0.44%   6174.03 ±0.02%    725.11     13.31%  Improved
ConcurrentStackThroughput 16T                   5482.35 ±0.49%   6025.84 ±0.03%    543.49      9.91%  Improved

With no delay between operations (less realistic), the tradeoff is more visible in throughput regressions. In a scenario where multiple operations are done frequently in short order on a concurernt collection, beyond a threshold a lock with a non-concurrent collection may perform better.

Spin                                           Left score       Right score      ∆ Score    ∆ Score %  Comment
---------------------------------------------  ---------------  ---------------  ---------  ---------  ---------------
ConcurrentBagFairness 02T                      99449.49 ±0.06%  99320.03 ±0.16%    -129.46     -0.13%
ConcurrentBagFairness 04T                      99790.30 ±0.06%  99613.59 ±0.13%    -176.71     -0.18%
ConcurrentBagFairness 08T                      94718.08 ±0.77%  93844.13 ±0.83%    -873.94     -0.92%
ConcurrentBagFairness 16T                        525.12 ±0.95%    561.36 ±1.05%      36.24      6.90%  Improved
ConcurrentBagThroughput 02T                    10208.16 ±0.28%  10041.72 ±0.25%    -166.45     -1.63%  Regressed
ConcurrentBagThroughput 04T                    11687.04 ±0.60%  11629.58 ±0.45%     -57.46     -0.49%
ConcurrentBagThroughput 08T                    16980.23 ±0.22%  17099.60 ±0.09%     119.36      0.70%  Likely improved
ConcurrentBagThroughput 16T                    16833.99 ±0.06%  17275.41 ±0.41%     441.41      2.62%  Improved
ConcurrentQueueFairness 02T                    99541.56 ±0.01%  99480.95 ±0.03%     -60.61     -0.06%
ConcurrentQueueFairness 04T                    42182.13 ±4.44%  99462.63 ±0.03%   57280.50    135.79%  Improved
ConcurrentQueueFairness 08T                     1928.71 ±2.78%  83839.00 ±1.20%   81910.28   4246.89%  Improved
ConcurrentQueueFairness 16T                     1289.63 ±2.27%   4618.29 ±0.59%    3328.66    258.11%  Improved
ConcurrentQueueThroughput 02T                  10725.42 ±1.96%   9764.64 ±0.47%    -960.78     -8.96%  Regressed
ConcurrentQueueThroughput 04T                   8377.90 ±1.29%   7770.49 ±0.56%    -607.41     -7.25%  Regressed
ConcurrentQueueThroughput 08T                   8846.80 ±0.47%   9080.83 ±0.10%     234.03      2.65%  Improved
ConcurrentQueueThroughput 16T                   9045.76 ±0.86%   9165.55 ±0.13%     119.80      1.32%
ConcurrentStackFairness 02T                     1698.35 ±5.23%  97748.43 ±0.02%   96050.08   5655.51%  Improved
ConcurrentStackFairness 04T                      551.04 ±1.88%  65313.83 ±0.22%   64762.79  11752.81%  Improved
ConcurrentStackFairness 08T                      366.45 ±1.13%  40789.38 ±0.28%   40422.93  11031.02%  Improved
ConcurrentStackFairness 16T                      233.11 ±0.94%  11143.66 ±0.24%   10910.55   4680.36%  Improved
ConcurrentStackThroughput 02T                  28438.66 ±0.49%  25582.18 ±0.05%   -2856.48    -10.04%  Regressed
ConcurrentStackThroughput 04T                  28893.91 ±0.14%  17577.92 ±0.10%  -11315.98    -39.16%  Regressed
ConcurrentStackThroughput 08T                  28715.13 ±0.05%   9811.45 ±0.47%  -18903.69    -65.83%  Regressed
ConcurrentStackThroughput 16T                  28405.37 ±0.16%  11763.53 ±0.44%  -16641.84    -58.59%  Regressed

Code for tests is here: #13670 (comment)