【问题标题】:Measuring the performance of a machine to compare code performance测量机器的性能以比较代码性能
【发布时间】:2012-11-23 02:30:42
【问题描述】:

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

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

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

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

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

答案在 Stopwatch.Frequency 中吗?

谁有更好的建议?

补充信息 -----

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

【问题讨论】:

    标签: c# performance


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 所以我最好的选择是,当我想进行比较时,只需运行这两种算法 - 如果它是在不同的机器上生成的,则永远不要使用历史基准。我必须承认,这是有道理的。
    • 回答您的更新:仍然没有,您必须将内存视为差异的一个微不足道的例子。具有 4Gb 的机器 A 可能不如具有 8Gb 的机器 B 工作。还有很多其他因素,甚至包括 CPU 的特性——不仅是速度,还有诸如 SSE2 或 3 条指令之类的东西,它们可能会用在一个上而不是另一个上。
    • 另外:衡量性能的最佳方法是使用性能计数器。如果您需要更准确的值,则必须使用高频计数器(使用 QueryPerformanceCounter)。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      取决于您是在寻找最低硬件建议还是在寻找环境调优。

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

      除了单核和多核这样的粗略差异之外比较不同的机器是徒劳的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-27
        • 2012-09-02
        • 2010-12-02
        • 2014-07-24
        • 2020-11-02
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        相关资源
        最近更新 更多