1

我正在使用 C# 在 .NET Framework 4.5 上运行

我希望测量代码性能,但有额外的复杂性,我想在机器(不同的硬件)之间进行比较。

核心目标之一是提出比较算法的基准(算法 X 与使用数据集 Z 的算法 Y),如果我始终使用相同的硬件,这很好,但我也希望可以选择将这些性能测试分布在许多机器-它们大多不同。

如何有效地衡量特定机器的性能?

我目前正在使用 System.Diagnostics.StopWatch 类与斐波那契套件混合,试图测量机器可以处理多少序列以使用 X 滴答/毫秒。但是,您可能已经知道这种技术不是很精确。

Stopwatch.Frequency 中的答案是什么?

有人有更好的建议吗?

附加信息 -----

示例:比较非多线程的算法(核心数量无关紧要)就像运行顺序扫描和使用红/黑树之间的区别一样。

4

3 回答 3

1

简单地说:你不能。或者至少,不可靠。

例如,我曾经与某人讨论过 .NET 中的静态方法和线程,并且我对几台机器进行了测试。运行相同的可执行文件,单核机器的性能优于双核机器。显然问题在于 .NET 运行时使用不同的内部算法来确定安全性(即,它在双核机器上放置的锁比单核机器上需要的锁更多,或者单核工作站和单核工作站之间的运行时不同)双核服务器)。关键是您甚至无法运行相同的可执行文件来获得不同的基线。

因此,如果您在机器 A 和 B 上运行算法 X,并记录差异(假设机器 B 的速度是机器 B 的两倍),那么您就不能在机器 A 上运行算法 Y,并假设如果在机器上执行该算法的运行速度将是原来的两倍B.

您必须考虑的因素的复杂性太大了。你所能做的就是在不同的机器上比较相同的东西,如果你正在测试机器性能,或者在同一台机器上比较不同的东西,等等。

于 2012-11-22T18:18:25.207 回答
0

不幸的是,实际上不可能提出一个准确的度量标准来比较一台计算机 A 在算法 X 上的时间与另一台计算机 B 在算法 Y 上的时间。例如,如果算法 X 比 Y 更占用内存并且计算机 A 运行缓慢与 B 相比,内存和更快的 CPU,算法 X 看起来很糟糕,即使它在计算机 B 上的运行速度可能比 Y 快。

你可以做的是在每台机器上运行每个算法,看看哪个算法具有最佳的平均运行时间、内存使用率等。

您也可以尝试提出一个指标来比较机器,就像您似乎正在尝试做的那样。如果你让它持续几秒钟,并且所有算法都依赖于大致相同比例的 CPU、磁盘、内存和各种 CPU 缓存级别,那么这应该是相当准确的。

于 2012-11-22T18:20:07.177 回答
0

不仅仅是机器。可能是它有多忙,忙什么。

取决于您是在寻找最低限度的硬件推荐,还是在寻找环境调优。

假设在一台机器上多次运行算法的两个版本之间,除了通常“更慢”或“更快”之外,算法只是不确定的

除了像单核和多核这样的总体差异之外,比较不同的机器是徒劳的。

于 2012-11-22T18:27:21.990 回答