程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 性能分析計時器

C# 性能分析計時器

編輯:C#入門知識

第一種方法:使用Stopwatch

Code
class Program
    {
        static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            sw.Reset();
            sw.Start();         

            for (int i = 0; i < 11031400; i++)
            {
                InternalMethod();
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds.ToString());

       }

    private static void InternalMethod()
        {
        }

}

上面的代碼重
 復調用了方法100多萬次,花的時間是7MS左右。而如果把for裡的方法調用去掉,則只需要3MS左右,也就是說100多萬次的調用要花費5MS左右的時間。             

for (int i = 0; i < 1103140; i++)
  {              
   // InternalMethod();          
  }  如果把for增加到1億次,則需要500多MS。


第二種方法:使用Environment.TickCount


Code
class Program
    {
        static void Main(string[] args)
        {
            long vTickCount = Environment.TickCount; //操作系統啟動經過的毫秒數 即開機的時間

            for (int i = 0; i < 1103140; i++)
            {
                //InternalMethod();
            }       

            Console.WriteLine(Environment.TickCount - vTickCount);
        }
    }
第三種方法:高性能精確測量:Win32 API 使用QueryPerformanceCounter() 和 QueryPerformanceFrequency() 方法支持高精度計時。

       這些方法,比“標准的”毫秒精度的計時方法如 GetTickCount() 之類有高得多的精度。另一方面來說,在 C# 中使用“非托管”的 API 函數會有一定的開銷,但比起使用一點都不精確的 GetTickCount() API 函數來說要好得多了。

第一個函數 QueryPerformanceCounter() 查詢任意時刻高精度計數器的實際值。第二個函數 QueryPerformanceFrequency() 返回高精度計數器每秒的計數值。為了獲得某一代碼段經歷的時間,你需要獲得代碼段開始前和結束後這兩個計時時刻的高精度計數器實際值。這兩個值的差指出了代碼段執行所經歷的時間。

然後通過將差除以每秒計數值(高精度計時器頻率),就可以計算經過的時間了。

duration = (stop - start) / frequency
經過時間 = (停止時間 - 開始時間) / 頻率


需要關於 QueryPerformanceCounter 和 QueryPerformanceFrequency 的更多信息,請參閱 MSDN 文檔。

下面的類實現了 QueryPerformanceCounter() 和 QueryPerformanceFrequency() API 函數的功能.

Code
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Threading;

namespace Win32
{
    internal class HiPerfTimer
    {
        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceCounter(
            out long lpPerformanceCount);

        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceFrequency(
            out long lpFrequency);

        private long startTime, stopTime;
        private long freq;

        // 構造函數
        public HiPerfTimer()
        {
            startTime = 0;
            stopTime  = 0;

            if (QueryPerformanceFrequency(out freq) == false)
            {
                // 不支持高性能計數器
                throw new Win32Exception();
            }
        }

        // 開始計時器
        public void Start()
        {
            // 來讓等待線程工作
            Thread.Sleep(0);

            QueryPerformanceCounter(out startTime);
        }

        // 停止計時器
        public void Stop()
        {
            QueryPerformanceCounter(out stopTime);
        }

        // 返回計時器經過時間(單位:秒)
        public double Duration
        {
            get
            {
                return (double)(stopTime - startTime) / (double) freq;
            }
        }
    }
}
 

使用這個類很簡單。只需要創建一個 HiPerfTimer 的實例,然後調用 Start() 開始計時,Stop() 停止計時。要獲得經過的時間,調用 Duration() 函數即可。

參考下面的例子。

HiPerfTimer pt = new HiPerfTimer();     // 創建新的 HiPerfTimer 對象
pt.Start();                             // 啟動計時器
Console.WriteLine("Test ");            // 需要計時的代碼
pt.Stop();                           &nb

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved