ScalabityExampleBenchmark.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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 ScalabilityExampleBenchmark : 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 = 50 * 1000 * 1000; // High number to make the overhead of RunConcurrent negligible.
  29. [Benchmark(OperationsPerInvoke = Iterations)]
  30. public void PerfectScalingExample()
  31. {
  32. RunConcurrent(() => { RunBody(); });
  33. }
  34. private int RunBody()
  35. {
  36. int result = 0;
  37. for (int i = 0; i < Iterations; i++)
  38. {
  39. // perform some operation that is completely independent from
  40. // other threads and therefore should scale perfectly if given
  41. // a dedicated thread.
  42. for (int j = 0; j < 100; j++)
  43. {
  44. result = result ^ i ^ j ;
  45. }
  46. }
  47. return result;
  48. }
  49. }
  50. }