代码之家  ›  专栏  ›  技术社区  ›  Unmesh Kondolikar

什么是性能计数器?

  •  3
  • Unmesh Kondolikar  · 技术社区  · 15 年前

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

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

    我在谷歌上搜索了一下,但奇怪的是没有找到任何很好的参考资料。

    2 回复  |  直到 15 年前
        1
  •  2
  •   KeithS    15 年前

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

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

        2
  •  1
  •   Steve Ellinger    15 年前

    .NET中的性能计数器特定于Windows。我不认为使用性能计数器来度量执行时间是一个好方法,这会使事情变得比我猜想的更复杂。Visual Studio包含一个性能工具,如果转到“查看-其他窗口-性能资源管理器”菜单,将出现“性能资源管理器”窗口,您可以单击“启动性能向导”按钮。 另一种可能是使用秒表类,如果您的计算机有一个秒表类,它将使用高分辨率计时器:

            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");
    
    推荐文章