統計程式碼執行時間,使用Stopwatch和UserProcessorTime的區別

Darren Ji發表於2014-10-13

當我們需要統計一段程式碼的執行時間,首先想到的可能是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;
        }
    }

1

以上,通過當前程式、當前執行緒的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 + "毫秒");
        }

2

 

為什麼使用Stopwatch統計程式碼執行時間,耗費時間更長呢?
--使用UserProcessorTime屬性來統計,統計的是當前程式、當前執行緒所消耗的CPU執行時間。而Stopwatch統計的程式碼執行時間,不僅包括了CPU的執行時間,還包括了在電腦螢幕上顯示字串所佔用的I/0時間。

相關文章