Advertisement
rx312

Rdtsc performance test

Jun 14th, 2021
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.65 KB | None | 0 0
  1. using System;
  2. using System.Diagnostics;
  3. using System.Threading;
  4.  
  5. namespace nettest
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             Console.WriteLine($"Rdtsc ticksPerMillisecond: {ticksPerMillisecond}");
  12.  
  13.             MethodA_UtcNow();
  14.             MethodB_RdtscP();
  15.             MethodC_Rdtsc();
  16.             MethodD_StopwatchGetTimestamp();
  17.             MethodE_EnvironmentTickCount();
  18.             MethodX_SimpleCount();
  19.         }
  20.  
  21.         private static void MethodA_UtcNow()
  22.         {
  23.             long cnt = 0;
  24.             var doneTime = DateTime.UtcNow.AddSeconds(1).Ticks;
  25.             var startDT = DateTime.Now;
  26.             while (DateTime.UtcNow.Ticks <= doneTime)
  27.             {
  28.                 cnt++;
  29.             }
  30.             var endDT = DateTime.Now;
  31.             Console.WriteLine("UtcNow      Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
  32.         }
  33.  
  34.         private static void MethodE_EnvironmentTickCount()
  35.         {
  36.             long cnt = 0;
  37.             int doneTick = Environment.TickCount + 1000;
  38.             var startDT = DateTime.Now;
  39.             while (Environment.TickCount <= doneTick)
  40.             {
  41.                 cnt++;
  42.             }
  43.             var endDT = DateTime.Now;
  44.             Console.WriteLine("TickCount   Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
  45.         }
  46.  
  47.         static ulong ticksPerMillisecond = CalibrateTSCTicksPerMillisecond();
  48.  
  49.         private static ulong CalibrateTSCTicksPerMillisecond()
  50.         {
  51.             ulong rate = 0;
  52.             ulong n = 100;
  53.             for (ulong i = 0; i < n; i++)
  54.             {
  55.                 ulong res = CountTSCTicksPerMillisecond();
  56.                 if (i == 0 || res < rate)
  57.                     rate = res;
  58.             }
  59.             return rate;
  60.         }
  61.  
  62.         private static ulong CountTSCTicksPerMillisecond()
  63.         {
  64.             ulong tsc1 = Rdtsc.TimestampP();
  65.             long ticks2 = DateTime.UtcNow.Ticks + TimeSpan.TicksPerMillisecond;
  66.             while (DateTime.UtcNow.Ticks < ticks2) ;
  67.             ulong tsc2 = Rdtsc.TimestampP();
  68.             return tsc2 - tsc1;
  69.         }
  70.  
  71.         private static void MethodC_Rdtsc()
  72.         {
  73.             long cnt = 0;
  74.             ulong doneTick = Rdtsc.Timestamp() + ticksPerMillisecond * 1000;
  75.             var startDT = DateTime.Now;
  76.             while (Rdtsc.Timestamp() <= doneTick)
  77.             {
  78.                 cnt++;
  79.             }
  80.             var endDT = DateTime.Now;
  81.             Console.WriteLine("Rdtsc       Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
  82.         }
  83.  
  84.         private static void MethodB_RdtscP()
  85.         {
  86.             long cnt = 0;
  87.             ulong doneTick = Rdtsc.TimestampP() + ticksPerMillisecond * 1000;
  88.             var startDT = DateTime.Now;
  89.             while (Rdtsc.TimestampP() <= doneTick)
  90.             {
  91.                 cnt++;
  92.             }
  93.             var endDT = DateTime.Now;
  94.             Console.WriteLine("RdtscP      Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
  95.         }
  96.  
  97.         private static void MethodD_StopwatchGetTimestamp()
  98.         {
  99.             long cnt = 0;
  100.             long doneTick = Stopwatch.GetTimestamp() + TimeSpan.TicksPerMillisecond * 1000;
  101.             var startDT = DateTime.Now;
  102.             while (Stopwatch.GetTimestamp() <= doneTick)
  103.             {
  104.                 cnt++;
  105.             }
  106.             var endDT = DateTime.Now;
  107.             Console.WriteLine("Stopwatch   Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
  108.         }
  109.  
  110.         private static void MethodX_SimpleCount()
  111.         {
  112.             readyEvent.Reset();
  113.             Thread counter = new Thread(CountBool);
  114.             Thread waiter = new Thread(WaitBool);
  115.             counter.Start();
  116.             waiter.Start();
  117.             waiter.Join();
  118.             counter.Join();
  119.         }
  120.  
  121.         private static void CountBool()
  122.         {
  123.             long cnt = 0;
  124.             readyEvent.WaitOne();
  125.             var startDT = DateTime.Now;
  126.             while (!done)
  127.             {
  128.                 cnt++;
  129.             }
  130.             var endDT = DateTime.Now;
  131.             Console.WriteLine("SimpleCount Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
  132.         }
  133.  
  134.         private static volatile bool done = false;
  135.         private static ManualResetEvent readyEvent = new ManualResetEvent(false);
  136.  
  137.         private static void WaitBool()
  138.         {
  139.             readyEvent.Set();
  140.             Thread.Sleep(TimeSpan.FromSeconds(1));
  141.             done = true;
  142.         }
  143.  
  144.     }
  145. }
  146.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement