AtomicCounterBenchmark.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #region Copyright notice and license
  2. // Copyright 2015 gRPC authors.
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. #endregion
  16. using System;
  17. using System.Runtime.InteropServices;
  18. using BenchmarkDotNet.Attributes;
  19. using Grpc.Core.Internal;
  20. namespace Grpc.Microbenchmarks
  21. {
  22. public class AtomicCounterBenchmark : CommonThreadedBase
  23. {
  24. protected override bool NeedsEnvironment => false;
  25. // An example of testing scalability of a method that scales perfectly.
  26. // This method provides a baseline for how well can CommonThreadedBase
  27. // measure scalability.
  28. const int Iterations = 20 * 1000 * 1000; // High number to make the overhead of RunConcurrent negligible.
  29. [Benchmark(OperationsPerInvoke = Iterations)]
  30. public void SharedAtomicCounterIncrement()
  31. {
  32. RunConcurrent(() => { RunBody(); });
  33. }
  34. readonly AtomicCounter sharedCounter = new AtomicCounter();
  35. private int RunBody()
  36. {
  37. for (int i = 0; i < Iterations; i++)
  38. {
  39. sharedCounter.Increment();
  40. }
  41. return (int) sharedCounter.Count;
  42. }
  43. }
  44. }