2012-11-22 73 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

同意,我在問題中增加了一些信息 –