2012-11-22 75 views
1

我使用C#测量机器的性能比较编码性能

我希望测量代码性能,但有额外的复杂性,我想有机器之间的对比(在.NET Framework 4.5操作不同的硬件)。

其中一个核心目标是提出基准比较算法(算法X与算法Y使用数据集Z),如果我始终使用相同的确切硬件,但我也希望可以选择分布式这些性能测试跨越多台机器 - 大多数不同。

如何高效地测量特定机器的性能?

我目前正在使用System.Diagnostics.StopWatch类与一个Fibonacci套件混合,试图测量机器可以处理多少个序列以便使用X ticks /毫秒。然而,正如你可能已经知道这种技术不是很精确。

StopWatch.Frequency中的答案是?

任何人有更好的建议吗?

添加的信息-----

实施例:比较是不是多线程(核数都不会有问题)像说运行顺序扫描,并且使用红色/黑色树之间的差的算法。

回答

1

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

因此,如果您在机器A和B上运行算法X并记录差异(可以说机器B的速度是机器B的两倍),则您无法在机器A上运行算法Y,并假定该算法的运行速度会快两倍如果在机器B上执行。

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

+0

所以我最好的选择是,当我想运行一个比较时,只需运行两种算法 - 如果它是在不同的机器上生成的,就不会使用历史基准测试。我必须承认,这是有道理的。 –

+0

回答你的更新:仍然没有,你必须考虑记忆作为一个微不足道的例子。使用4Gb的机器A可能无法像使用8Gb的机器B一样工作。还有其他一些因素的负载,甚至包括CPU的功能 - 不仅仅是速度,还有像SSE2或者3条指令这样的东西,可能会在一个上使用,而不是另一个。 – gbjbaanb

+0

另外:衡量性能的最佳方法是使用性能计数器。如果您需要更准确的值,则必须使用高频计数器(使用QueryPerformanceCounter)。 – gbjbaanb

0

不幸的是,它不是真的有可能拿出一个准确的指标例如,如果算法X的内存密度大于Y,并且计算机A的内存比CPU慢,并且CPU速度更快,那么算法X将会看起来像一个计算机的时间可怕的,尽管它在计算机B上的运行速度可能比Y快。

你可以做的是运行在每台机器上的每个算法,看看它的算法有最好的平均运行时间,内存使用情况等

您也可以尝试拿出一个指标,以比较的机器,你似乎试图去做。如果持续几秒钟,并且所有算法都依赖CPU,磁盘,内存和各种CPU高速缓存级别的大致相同比例,则这应该相当准确。

+0

同意,我给这个问题增加了一些信息 –

0

不只是机器是它。可能是多么忙碌,什么。

取决于您是在寻找最低硬件建议还是您正在寻找适合环境的调整。

若干一台机器上的算法的两个版本的运行之间的假设是仅下降到alogorithms是除了大致“慢”或“更快”

比较不同机器超出毛difefrences如单和玄乎多核心,是徒劳的练习。

+0

同意,我在问题中增加了一些信息 –