什么是性能计数器?

Posted

技术标签:

【中文标题】什么是性能计数器?【英文标题】:What are performance counters? 【发布时间】:2010-09-24 15:27:52 【问题描述】:

什么是性能计数器,它们是如何工作的?它们是特定于 Windows 的,还是操作系统级别的概念,也可用于 Linux 等?

如何在我的 .NET 应用程序中使用它们来测量我的应用程序各个部分的执行时间?

我用谷歌搜索,但令人惊讶的是没有找到任何很好的参考资料。

【问题讨论】:

【参考方案1】:

作为一个概念,性能计数器是内核或应用程序可以向操作系统报告的可测量、可报告的指标。 CPU负载、内存使用、网络带宽等都是性能计数器的例子。它不仅仅是基于硬件的。网络服务器可以报告它正在处理的会话数,或者数据库服务器可以报告连接数和查询/秒。至少在 Windows 中,您可以为您的应用程序创建自己的;如果您有一个将输入文件处理到数据库中的服务器应用程序,您可以让它以文件/秒或 KB/秒为单位报告其吞吐量。您可以按连续数小时报告服务器正常运行时间,也可以按安装时间百分比报告。

根据您的开发环境(语言、框架、库)和目标操作系统,您访问或创建性能计数器的方式会有很大差异,但我想不出一个至少不能报告硬件的现代内核性能数据。

【讨论】:

【参考方案2】:

.Net 中的性能计数器特定于 Windows。我不认为使用性能计数器来测量执行时间是一个好方法,它会使事情变得比我怀疑的更复杂。 Visual Studio 包含一个性能工具,如果您转到 View - OtherWindows - Performance Explorer 菜单,性能浏览器窗口会出现,您可以单击 Launch Performance Wizard 按钮。 另一种可能性是使用 Stopwatch 类,如果您的计算机有一个,它将使用高分辨率计时器:

        Int64 nanoSecPerTick = (1000L * 1000L * 1000L) / Stopwatch.Frequency;
        Stopwatch timer = Stopwatch.StartNew();
        // execute the code that you want to time
        timer.Stop();
        Int64 nanoSec = timer.ElapsedTicks / nanoSecPerTick;
        // or if you don't need such fine grained timing:
        Int64 milliSec = timer.ElapsedMilliseconds;
        Console.Write("Elapsed time: " + nanoSec + "ns");

【讨论】:

你提到的性能工具只有Premium或Ultimate版本。

以上是关于什么是性能计数器?的主要内容,如果未能解决你的问题,请参考以下文章

获取进程的CPU和内存使用情况的正确性能计数器是什么?

WCF“服务”性能计数器命名

自定义性能计数器触发安全异常。为啥?

服务器开发中的性能计数器

性能计数器 - 每分钟速率类型? [复制]

在 Azure 中使用 Visual Studio Online 加载测试性能计数器