Don't multiply YieldProcessor count by proc count (#13556)
authorKoundinya Veluri <kouvel@users.noreply.github.com>
Fri, 25 Aug 2017 20:14:59 +0000 (13:14 -0700)
committerGitHub <noreply@github.com>
Fri, 25 Aug 2017 20:14:59 +0000 (13:14 -0700)
Related to issue mentioned in https://github.com/dotnet/coreclr/issues/13388
- Multipying the YieldProcessor count by proc count can cause excessive delays that are not fruitful on machines with a large number of procs. Even on a 12-proc machine (6-core), the heuristics as they are without the multiply seem to perform much better.
- The issue above also mentions that the delay of PAUSE on Intel Skylake+ processors have a significantly larger delay (140 cycles vs 10 cycles). Simulating that by multiplying the YieldProcessor count by 14 shows that in both tests tested, it begins crawling at low thread counts.
- I did most of the testing on ManualResetEventSlim, and since Task is using the same spin heuristics, applied the same change there as well.

src/mscorlib/src/System/Threading/ManualResetEventSlim.cs
src/mscorlib/src/System/Threading/Tasks/Task.cs

index 402a76c..e396968 100644 (file)
@@ -584,7 +584,7 @@ namespace System.Threading
                         }
                         else
                         {
-                            Thread.SpinWait(PlatformHelper.ProcessorCount * (4 << i));
+                            Thread.SpinWait(4 << i);
                         }
                     }
                     else if (i % HOW_MANY_YIELD_EVERY_SLEEP_1 == 0)
index 00d52ea..8e84884 100644 (file)
@@ -2986,7 +2986,7 @@ namespace System.Threading.Tasks
                 }
                 else
                 {
-                    Thread.SpinWait(PlatformHelper.ProcessorCount * (4 << i));
+                    Thread.SpinWait(4 << i);
                 }
             }