當我們需要統計一段程式碼的執行時間,首先想到的可能是Stopwatch類。在這裡,先暫不使用Stopwatch,自定義一個統計程式碼執行時間的類,大致需要考慮到:
1、確保統計的是當前程式、當前執行緒中程式碼的執行時間。
2、在統計執行過程中,不允許有垃圾回收。即在統計程式碼執行時間之前,就讓GC完成垃圾回收。
舉例:統計顯示一個陣列元素所消耗的時間
class Program
{static void Main(string[] args){int[] arrs = new int[10000];BuildArray(arrs);CalculateTiming calculateTiming = new CalculateTiming();
calculateTiming.Start();DisplaySomeDigits(arrs);calculateTiming.Stop();Console.WriteLine("所耗費時間為:" + calculateTiming.Result().TotalMilliseconds + "毫秒");}//顯示陣列元素
static void DisplaySomeDigits(int[] arr){for (int i = 0; i < arr.Length; i++){Console.Write(arr[i] + " ");
}}//建立陣列
static void BuildArray(int[] arr){for (int i = 0; i < arr.Length; i++){arr[i] = i;}}}/// <summary>
/// 計算CPU消耗時間
/// </summary>
public class CalculateTiming{private TimeSpan startTime;
private TimeSpan duration;
public CalculateTiming()
{startTime = new TimeSpan(0);
duration = new TimeSpan(0);
}public void Start(){//手動執行垃圾回收
GC.Collect();//掛起當前執行緒,直到使用GC對所有託管堆上的物件實施Finalize方法
GC.WaitForPendingFinalizers();//獲取當前程式、當前執行緒執行的起始時間
startTime = Process.GetCurrentProcess().Threads[0].UserProcessorTime;}public void Stop(){//獲取當前程式、當前執行緒執行所消耗的時間
duration = Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(startTime);}public TimeSpan Result()
{return duration;
}}
以上,通過當前程式、當前執行緒的UserProcessorTime屬性來統計程式碼執行時間。
如果使用Stopwatch來統計程式碼執行時間。
static void Main(string[] args){int[] arrs = new int[10000];BuildArray(arrs);Stopwatch sw = new Stopwatch();
sw.Start();DisplaySomeDigits(arrs);sw.Stop();Console.WriteLine("所耗費時間為:" + sw.ElapsedMilliseconds + "毫秒");}
為什麼使用Stopwatch統計程式碼執行時間,耗費時間更長呢?
--使用UserProcessorTime屬性來統計,統計的是當前程式、當前執行緒所消耗的CPU執行時間。而Stopwatch統計的程式碼執行時間,不僅包括了CPU的執行時間,還包括了在電腦螢幕上顯示字串所佔用的I/0時間。