Skip to content

Commit

Permalink
Don't multiply YieldProcessor count by proc count
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
kouvel committed Aug 23, 2017
1 parent 2766385 commit 12e37e7
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/mscorlib/src/System/Threading/ManualResetEventSlim.cs
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,7 @@ public bool Wait(int millisecondsTimeout, CancellationToken cancellationToken)
}
else
{
Thread.SpinWait(PlatformHelper.ProcessorCount * (4 << i));
Thread.SpinWait(4 << i);
}
}
else if (i % HOW_MANY_YIELD_EVERY_SLEEP_1 == 0)
Expand Down
2 changes: 1 addition & 1 deletion src/mscorlib/src/System/Threading/Tasks/Task.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2986,7 +2986,7 @@ private bool SpinWait(int millisecondsTimeout)
}
else
{
Thread.SpinWait(PlatformHelper.ProcessorCount * (4 << i));
Thread.SpinWait(4 << i);
}
}

Expand Down

0 comments on commit 12e37e7

Please sign in to comment.