Program.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace MaybeNullSpeedTest
  7. {
  8. class Program
  9. {
  10. class Foo
  11. {
  12. public void DoSomething() { }
  13. }
  14. static Foo bar = new Foo();
  15. static double rawTime, wrappedTime;
  16. static Random R = new Random();
  17. static Foo RawRef()
  18. {
  19. if (R.NextDouble() < 0.1f)
  20. return null;
  21. return bar;
  22. }
  23. static DwarfCorp.MaybeNull<Foo> WrappedRef()
  24. {
  25. if (R.NextDouble() < 0.1f)
  26. return null;
  27. return bar;
  28. }
  29. static void Main(string[] args)
  30. {
  31. int iters = 10000;
  32. int tests = 10000;
  33. #if DEBUG
  34. Console.WriteLine("DEBUG: Running {0} tests of {1} iterations", tests, iters);
  35. #else
  36. Console.WriteLine("RELEASE: Running {0} tests of {1} iterations", tests, iters);
  37. #endif
  38. for (var i = 0; i < tests; ++i)
  39. {
  40. Console.SetCursorPosition(0, 1);
  41. Console.Write("{0} of {1}", i, tests);
  42. RunTest(iters);
  43. }
  44. var averageRaw = rawTime / (double)tests;
  45. var averageWrap = wrappedTime / (double)tests;
  46. Console.WriteLine();
  47. Console.WriteLine("Raw: {0}", averageRaw);
  48. Console.WriteLine("Wra: {0}", averageWrap);
  49. Console.WriteLine("Rat: {0}", averageWrap / averageRaw);
  50. Console.ReadLine();
  51. }
  52. static void RunTest(int iterations)
  53. {
  54. // Need high precision timers.
  55. var start = DateTime.Now;
  56. for (var i = 0; i < iterations; ++i)
  57. {
  58. var x = RawRef();
  59. if (x != null)
  60. x.DoSomething();
  61. }
  62. var end = DateTime.Now;
  63. rawTime += (end - start).TotalMilliseconds;
  64. start = DateTime.Now;
  65. for (var i = 0; i < iterations; ++i)
  66. if (WrappedRef().HasValue(out var x))
  67. x.DoSomething();
  68. end = DateTime.Now;
  69. wrappedTime += (end - start).TotalMilliseconds;
  70. }
  71. }
  72. }