如何计算一段.NET代码的CPU使用率?

如何计算一段.NET代码的CPU使用率?,.net,performance,optimization,cpu-usage,.net,Performance,Optimization,Cpu Usage,我们的工具会在诊断模式下生成性能日志,但我们会在代码执行时间(秒表+毫秒)中跟踪性能 显然,它根本不可靠,测试系统的CPU可以被一些随机进程使用,如果您将工具配置为运行10个线程而不是2个线程,结果将完全不同,等等 我的问题是: 找出一段代码(而不是整个过程)的正确CPU时间的正确方法是什么 我所说的CPU时间是什么意思: 基本上是多少周期的CPU花费。我假设,对于同一台计算机中的同一段代码,这将始终是相同的,并且不受其他进程的影响。这里可能有一些基本的东西我遗漏了,如果是的话,请在评论或回答中

我们的工具会在诊断模式下生成性能日志,但我们会在代码执行时间(秒表+毫秒)中跟踪性能

显然,它根本不可靠,测试系统的CPU可以被一些随机进程使用,如果您将工具配置为运行10个线程而不是2个线程,结果将完全不同,等等

我的问题是:

找出一段代码(而不是整个过程)的正确CPU时间的正确方法是什么

我所说的CPU时间是什么意思:

基本上是多少周期的CPU花费。我假设,对于同一台计算机中的同一段代码,这将始终是相同的,并且不受其他进程的影响。这里可能有一些基本的东西我遗漏了,如果是的话,请在评论或回答中启发我

另外,在我们的设置中不可能使用探查器

另一个更新

我为什么不使用探查器

因为我们需要使用不同的数据在不同的环境中测试代码,而在这些环境中我们没有分析器或IDE之类的东西。因此,代码本身应该处理它。一个极端的选择可能是使用探查器的DLL,但我认为这项任务不需要如此复杂的解决方案(假设没有免费且易于实现的评测库)

我假设,对于同一台计算机中的同一段代码,这将始终是相同的,并且不受其他进程的影响

这不是电脑的工作方式。代码在很大程度上受机器上运行的其他进程的影响。一台典型的Windows计算机大约有1000个活动线程,您可以在Taskmgr.exe的“性能”选项卡中看到该数字。他们中的绝大多数人都在睡觉,等待着窗户发出的某种信号。尽管如此,如果机器正在运行代码,包括您的代码,这些代码已经准备就绪,需要占用CPU时间,那么Windows将为它们提供一块蛋糕

这使得测量代码所花费的时间是一个相当随意的测量。你唯一能估计的就是所花费的最少时间。通过多次运行测试,您很有可能得到一个不受其他进程影响的样本。然而,这在现实生活中永远不会发生,你最好将中值作为一个现实的性能度量

唯一真正有用的度量是度量算法的增量改进。更改代码,查看中间时间是如何因此而更改的

基本上是多少周期的CPU花费。我 假设这将始终是相同的 同一个系统中的同一段代码 计算机,不受其他因素的影响 过程。可能会有一些 我这里缺少的基本东西, 如果是这样,请在下面的对话中给我启发 评论或回答

函数使用的CPU时间是一个非常模糊的概念

  • 它是否包括在调用树中它下面的任何位置执行的I/O
  • 这只是“自我时间”还是包括被叫人?(在严肃的代码中,自我时间通常为零。)
  • 它是所有调用的平均值吗?定义“所有”
  • 谁使用这些信息,目的是什么?寻找所谓的“瓶颈”?或者只是某种回归跟踪的目的
如果目的不仅仅是测量,而是找到值得优化的代码,那么我认为一个更有用的概念是堆栈时间的百分比。收集这些信息的一种简单方法是在随机的挂钟时间(在您关心的时间间隔内)读取函数调用堆栈。这具有以下特性:

  • 它表示包含时间百分比
  • 它给出了行级别(而不仅仅是函数级别)的百分比,因此它精确地指出了代价高昂的代码行,无论它们是否是函数调用
  • 它包括I/O和CPU时间。(在严肃的软件中,排除I/O时间是不明智的,因为您真的不知道在调用树的下面几层花费了多少时间。)
  • 它对其他进程争夺CPU或CPU速度相对不敏感
  • 它不需要高采样率或大量样本来查找代价高昂的代码。() 每增加一位数的测量精度都需要大约100倍的样本,但这并不能更精确地定位昂贵的代码
根据这一原理工作的分析器是


另一方面,如果目标只是测量,这样用户就可以看到更改是否有助于或损害性能,那么就需要控制CPU环境,我建议使用简单的总体时间测量。

测量CPU时间的最佳方法是使用指令“rdtsc”或“读取时间戳计数器”。此计数器(CPU本身的一部分)按CPU的内部时钟速度递增。因此,两个读数之间的差异是经过的时钟周期数。如果该计数器(代码)的级别不太高(尽管不太确定),则可以将其集成到代码中。你可以测量磁盘上的时间、网络上的时间、CPU上的时间等等——可能性是无穷的。例如,如果将经过的时钟周期数除以以兆赫为单位的CPU速度,则会得到经过的微秒数。这是相当好的精度,更好的可能是考虑建立一个GUI接口到您的CPU使用统计数据


在您环境的帮助文件中搜索“rdtsc”或“rdtsc”或“rdtsc”。

您能定义“CPU时间”吗?实时(以毫秒/ticks/etc为单位)在不同的机器之间会有所不同,甚至所需的处理器周期数也会因操作系统、CPU等而异。我更新了问题:“CPU占用了多少周期,只要同一台计算机在不同的执行中都是相同的,并且不受其他进程的影响,就可以了”如果没有探查器,你就不能这样做,这正是你需要的工具。@Jonathan-我有.NET,假设探查器是一堆t