2009-01-04 114 views
62

有沒有人使用秒錶基準測試,或者應該使用性能工具?是否有任何可用於Java的免費工具?你用什麼工具?秒錶基準測試是否可以接受?

爲了澄清我的擔憂,秒錶基準測試由於操作系統調度而出現錯誤。在您的程序運行過程中,操作系統可能會安排另一個進程(或幾個進程)處於您計時功能的中間。在Java中,如果您嘗試使用線程化應用程序,則情況會更糟糕,因爲JVM調度程序甚至會將混亂中的一些隨機性引入更多。

基準測試時如何解決操作系統調度問題?

回答

41

如果您測量的迭代次數足夠有意義,則秒錶基準測試無誤。通常,我需要一定數量的單位數字秒的總時間。否則,您的結果很容易因計劃安排和其他操作流程中斷而顯着偏斜。

爲此,我使用了很久以前生成的一些靜態方法,這些方法基於System.currentTimeMillis()

對於分析工作,我使用了jProfiler多年,並發現它非常好。我最近看過YourKit,這在網站上看起來很棒,但我個人並沒有使用它。

要回答關於計劃中斷的問題,我發現重複運行直到實現一致性/觀察在實踐中工作以清除進程調度中的異常結果。我還發現,線程調度對於5到30秒之間的運行沒有實際影響。最後,按照我的經驗,在通過幾秒鐘閾值調度之後,對結果的影響可以忽略不計 - 我發現5秒鐘的運行時間與迭代的5分鐘運行時間保持一致。

您可能還想考慮預先運行測試代碼大約10,000次以「準備」JIT,具體取決於您希望測試代碼在現實生活中隨時間流逝的次數。

+0

謝謝。我有一種感覺,這會非常普遍,我很難在沒有外界確認的情況下爲自己辯護。 :) – 2009-01-06 13:04:47

0

我總是使用秒錶基準測試,因爲它非常容易。儘管如此,結果並不需要非常準確。如果你需要準確的結果,那麼你不應該使用秒錶基準測試。

0

我不認爲秒錶基準測試太可怕了,但是如果您可以使用Solaris或OS X機器,則應該查看DTrace。我用它來獲取關於我的應用程序的時間的一些很好的信息。

5

分析器爲您提供了更詳細的信息,它可以幫助診斷和修復性能問題。

在實際測量方面,秒錶時間是用戶注意到的,所以如果您想驗證物體在可接受的範圍內,則秒錶時間沒問題。

但是,如果您想真正解決問題,那麼分析器可能會非常有用。

1

我今天運行了一個程序,它搜索並收集了一系列dBase文件的信息,運行了一個多小時。我看了一下代碼,猜測瓶頸是什麼,對算法做了一些小改進,然後重新執行程序,這次在2.5分鐘內完成。我不需要任何花哨的分析工具或基準套件來告訴我新版本是一個重大改進。如果我需要進一步優化運行時間,我可能會做一些更復雜的分析,但這不是必需的。我發現這種「秒錶基準測試」在許多情況下是可接受的解決方案,在這些情況下采用更先進的工具實際上會更費時間。

+1

我不介意downvote出於合法的原因,但至少有正派解釋什麼是錯誤的/無助的答案,當你這樣做。 – 2009-01-04 07:06:57

0

我一直這樣做。我寧願使用分析器,但我正在使用的特定於域的語言的供應商不提供一個。

6

只要您測量的時間足夠長,就完全有效。我會執行20-30次你打算測試的內容,以便總時間超過1秒。我注意到基於System.currentTimeMillis()的時間計算往往是0ms或〜30ms;我認爲你可以得到比這更精確的任何東西。你可能想嘗試System.nanoTime()如果你真的需要測量一個小的時間間隔:

1

畢竟,這可能是標杆的第二個最普遍的形式,對「無手錶標杆」之後 - 在這裏我們說:「這個活動看起來很慢,一個似乎快。」

通常情況下,優化最重要的是什麼干擾用戶體驗 - 這通常是您執行操作的頻率以及同時進行的其他操作的功能。其他形式的基準測試通常只會幫助您完成這些測試。

2

分析器可以阻礙計時,所以我會結合使用秒錶計時來識別整體性能問題,然後使用分析器計算出時間花費的位置。根據需要重複。

1

我認爲一個關鍵問題是操作的複雜性和時間長度。

我有時甚至使用物理秒錶測量來查看是否需要幾分鐘,幾小時,幾天甚至幾周來計算(我正在使用一個應用程序,其中幾天的訂單運行時間不是聞所未聞的,即使秒和分鐘是最常見的時間跨度)。然而,通過調用計算機上任何類型的時鐘系統(如鏈接文章中提到的java millis調用)所提供的自動化,顯然要比手動查看運行多長時間的優勢更爲明顯。

分析器在工作時很好,但是我們在將它們應用到我們的應用程序時遇到了問題,這些應用程序通常涉及動態代碼生成,動態加載DLL以及在兩個內置的即時操作系統中執行的工作,編譯我的應用程序的腳本語言。它們通常僅限於假設單一的源語言和對複雜軟件的其他不切實際的期望。

4

秒錶實際上是最好的基準!

真正的端到端用戶響應時間是真正重要的時間。

使用可用的工具獲取這段時間並不總是可行的,例如大多數測試工具不包括瀏覽器呈現頁面所需的時間,因此具有錯誤寫入的CSS的過度複雜頁面將顯示次要第二響應時間到測試工具,但是,5秒加上對用戶的響應時間。

這些工具非常適合自動化測試,並且可以幫助您確定問題,但不會忽視您真正想測量的內容。

4

您需要測試一個實際的迭代次數,因爲您將得到不同的答案,具體取決於您如何測試計時。如果您只執行一次操作,則可能會誤導多次迭代的平均值。如果您想知道JVM加熱後需要多少時間,則可能會運行很多(例如10,000次)迭代,這些迭代不包括在時序中。

我還建議你使用System.nanoTime(),因爲它更準確。如果您的測試時間在10微秒或更短的時間內,您不希望太頻繁地調用它,或者它可能會改變結果。 (例如,如果我正在測試5秒鐘,並且想知道何時達到這一點,我只能每1000次迭代才能獲得nanoTime,如果我知道迭代非常快)

1

如何解決操作系統調度問題基準測試時?

在系統上足夠長的基準,該系統代表您將使用的機器。如果你的操作系統減慢你的應用程序,那麼這應該是結果的一部分。

毫無疑問,如果我沒有操作系統,我的程序會更快。

如果您正在使用Linux,您可以使用工具,如numactlchrttaskset控制的CPU是如何使用和調度。