1. 程式人生 > >Thread.Sleep和Timer效能比較

Thread.Sleep和Timer效能比較

今天比較一下Timer和Sleep.

結果:Thread.sleep,問天下誰於爭峰。

空間:
Type         work set      virtual bytes    page file bytes  Thread Count Handle  
Timer        8.990.720     114.978.816      11.444.224       4       115 
Thread.Sleep 6.590464      104.296.448      7.143.424        3        95

Thread.Sleep全勝

時間:
Type         start Time    Interval times   finish time 
Timer        11:53:37:416  10ms 100000      12:19:37:555 
Thread.Sleep 11:53:37:432  10ms 100000      12:19:36:713

Timer和Thread.Sleep打個平手,但Thread.sleep還是要強那麼一點

分析:
Thread.sleep直接呼叫核心的指令,所線上程掛起,CPU執行佇列的重排序。
Timer每次Elapsed會線上程池中取新的執行緒來執行,存在多次訪問執行緒池的損耗。

測試程式碼:

  1. class Program  
  2. {  
  3.     privatestatic System.Timers.Timer _timer;  
  4.     privatestatic volatile int _Max = 100000;  
  5.     privatestatic volatile int _ThreadMax = 100000;  
  6.     staticvoid Main(string[] args)  
  7.     {  
  8.         Console.WriteLine(System.DateTime.Now.ToString() + System.DateTime.Now.Millisecond.ToString());  
  9.         StartTimer();  
  10.         Console.WriteLine(System.DateTime.Now.ToString() + System.DateTime.Now.Millisecond.ToString());  
  11.         StartThread();  
  12.         Console.ReadLine();  
  13.     }  
  14.     staticprivatevoid StartThread()  
  15.     {  
  16.         Thread s = new Thread(ThreadGo);  
  17.         s.Start();  
  18.     }  
  19.     staticprivatevoid ThreadGo()  
  20.     {  
  21.         while (true)  
  22.         {  
  23.             Thread.Sleep(10);  
  24.             _ThreadMax--;  
  25.             if (_ThreadMax < 0) break;  
  26.         }  
  27.         Console.WriteLine("ThreadGo" + System.DateTime.Now.ToString() + System.DateTime.Now.Millisecond.ToString());  
  28.         Thread.CurrentThread.Abort();  
  29.     }  
  30.     staticprivatevoid StartTimer()  
  31.     {  
  32.         _timer = new System.Timers.Timer();  
  33.         _timer.AutoReset = true;  
  34.         _timer.Interval = 10;  
  35.         _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);  
  36.         _timer.Start();  
  37.     }  
  38.     staticvoid _timer_Elapsed(object sender, ElapsedEventArgs e)  
  39.     {  
  40.         _Max--;  
  41.         if(_Max<0)  
  42.         {  
  43.             Console.WriteLine("_timer_Elapsed" + System.DateTime.Now.ToString() + System.DateTime.Now.Millisecond.ToString());  
  44.             _timer.Stop();  
  45.             _timer.Dispose();  
  46.         }  
  47.     }  
  48. }