代码之家  ›  专栏  ›  技术社区  ›  Eric Schoonover thSoft

如何在系统中使用AverageTimer32和AverageBase性能计数器。诊断。秒表?

  •  25
  • Eric Schoonover thSoft  · 技术社区  · 16 年前

    当我执行以下程序并查看性能计数器时,结果对我来说没有意义。平均值为零,最小值/最大值为~0.4,而我预期为~0.1或~100。

    class Program
    {
        const string CategoryName = "____Test Category";
        const string CounterName = "Average Operation Time";
        const string BaseCounterName = "Average Operation Time Base";
    
        static void Main(string[] args)
        {
            if (PerformanceCounterCategory.Exists(CategoryName))
                PerformanceCounterCategory.Delete(CategoryName);
    
            var counterDataCollection = new CounterCreationDataCollection();
    
            var avgOpTimeCounter = new CounterCreationData()
            {
                CounterName = CounterName,
                CounterHelp = "Average Operation Time Help",
                CounterType = PerformanceCounterType.AverageTimer32
            };
            counterDataCollection.Add(avgOpTimeCounter);
    
            var avgOpTimeBaseCounter = new CounterCreationData()
            {
                CounterName = BaseCounterName,
                CounterHelp = "Average Operation Time Base Help",
                CounterType = PerformanceCounterType.AverageBase
            };
            counterDataCollection.Add(avgOpTimeBaseCounter);
    
            PerformanceCounterCategory.Create(CategoryName, "Test Perf Counters", PerformanceCounterCategoryType.SingleInstance, counterDataCollection);
    
            var counter = new PerformanceCounter(CategoryName, CounterName, false);
            var baseCounter = new PerformanceCounter(CategoryName, BaseCounterName, false);
    
            for (int i = 0; i < 500; i++)
            {
                var sw = Stopwatch.StartNew();
                Thread.Sleep(100);
                sw.Stop();
    
                Console.WriteLine(string.Format("t({0}) ms({1})", sw.Elapsed.Ticks, sw.Elapsed.TotalMilliseconds));
                counter.IncrementBy(sw.Elapsed.Ticks);
                baseCounter.Increment();
            }
    
            Console.Read();
        }
    }
    

    性能计数器屏幕截图 Performance Counter Screenshot http://friendfeed-media.com/50028bb6a0016931a3af5122774b56f93741bb5c

    3 回复  |  直到 16 年前
        1
  •  35
  •   Mark Seemann    16 年前

    如果你使用 StopWatch.ElapsedTicks 而不是秒表。逝去。滴答,它应该工作。

    documentation 包含有关此的更多信息。

        2
  •  9
  •   Martin Liversage    9 年前

    AverageTimer32 性能计数器 TimeSpan 而不是a Stopwatch

    var performanceCounterTicks = timeSpan.Ticks*Stopwatch.Frequency/TimeSpan.TicksPerSecond;
    averageTimerCounter.IncrementBy(performanceCounterTicks);
    averageTimerCounterBase.Increment();
    
        3
  •  1
  •   RobV8R    11 年前

    TimeSpan , StopWatch ,或 DateTime 使用性能计数器时。相反,他建议在我的项目中添加以下原生方法:

    internal static class NativeMethods
    {
        [DllImport("Kernel32.dll")]
        public static extern void QueryPerformanceCounter(ref long ticks); 
    }
    

    当递增计数器时,他建议这样做:

    public void Foo()
    {
        var beginTicks = 0L;
    
        var endTicks = 0L;
    
        NativeMethods.QueryPerformanceCounter(ref beginTicks);
    
        // Do stuff
    
        NativeMethods.QueryPerformanceCounter(ref endTicks);
    
        this.Counter.IncrementBy(endTicks - beginTicks);
        this.BaseCounter.Increment();
    }
    
    推荐文章