PerfTimer.cs
上传用户:hbhltzc
上传日期:2022-06-04
资源大小:1925k
文件大小:3k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. // File: PerfTimer.cs
  3. //
  4. // A basic class for inheriting Tests that want to get timing information.
  5. //---------------------------------------------------------------------------
  6. #if PERFTIMER
  7. using System;
  8. using System.Runtime.InteropServices;
  9. namespace XmlNotepad {
  10.     internal class PerfTimer {
  11.         long m_Start;
  12.         long m_End;
  13.         long m_Freq;
  14.         long m_Min;
  15.         long m_Max;
  16.         long m_Count;
  17.         long m_Sum;
  18. [DllImport("KERNEL32.DLL", EntryPoint = "QueryPerformanceCounter", SetLastError = true,
  19. CharSet = CharSet.Unicode, ExactSpelling = true,
  20. CallingConvention = CallingConvention.StdCall)]
  21. public static extern int QueryPerformanceCounter(ref long time);
  22. [DllImport("KERNEL32.DLL", EntryPoint = "QueryPerformanceFrequency", SetLastError = true,
  23.  CharSet = CharSet.Unicode, ExactSpelling = true,
  24.  CallingConvention = CallingConvention.StdCall)]
  25. public static extern int QueryPerformanceFrequency(ref long freq);
  26.         public PerfTimer() {
  27.             m_Start = m_End = 0;
  28.             QueryPerformanceFrequency(ref m_Freq);
  29.             m_Min = m_Max = m_Count = m_Sum = 0;
  30.         }
  31.         public void Start() {
  32.             m_Start = GetTime();
  33.             m_End = m_Start;
  34.         }
  35.         public void Stop() {
  36.             m_End = GetTime();
  37.         }
  38.         public long GetDuration() { // in milliseconds.            
  39.             return GetMilliseconds(GetTicks());
  40.         }
  41.         public long GetMilliseconds(long ticks) {
  42.             return (ticks * (long)1000) / m_Freq;
  43.         }
  44.         public long GetTicks() {
  45.             return (m_End - m_Start);
  46.         }
  47.         static public long GetTime() { // in nanoseconds.
  48.             long i = 0;
  49.             QueryPerformanceCounter(ref i);
  50.             return i;
  51.         }
  52.         // These methods allow you to count up multiple iterations and
  53.         // then get the median, average and percent variation.
  54.         public void Count(long ms) {
  55.             if (m_Min == 0) m_Min = ms;
  56.             if (ms < m_Min) m_Min = ms;
  57.             if (ms > m_Max) m_Max = ms;
  58.             m_Sum += ms;
  59.             m_Count++;
  60.         }
  61.         public long Min() {
  62.             return m_Min;
  63.         }
  64.         public long Max() {
  65.             return m_Max;
  66.         }
  67.         public double Median() {
  68.             return TwoDecimals(m_Min + ((m_Max - m_Min) / 2.0));
  69.         }
  70.         public double PercentError() {
  71.             double spread = (m_Max - m_Min) / 2.0;
  72.             double percent = TwoDecimals((double)(spread * 100.0) / (double)(m_Min));
  73.             return percent;
  74.         }
  75.         static public double TwoDecimals(double i) {
  76.             return Math.Round(i * 100) / 100;
  77.         }
  78.         public long Average() {
  79.             if (m_Count == 0) return 0;
  80.             return m_Sum / m_Count;
  81.         }
  82.         public void Clear() {
  83.             m_Start = m_End = m_Min = m_Max = m_Sum = m_Count = 0;
  84.         }
  85.     }
  86. }
  87. #endif