簡體   English   中英

Java中的CPU執行時間

[英]CPU execution time in Java

我想計算我的函數在 Java 中執行需要多少 CPU 時間。 目前我正在做如下。

   long startTime = System.currentTimeMillis();
    myfunction();
    long endTime = System.currentTimeMillis();
    long searchTime = endTime - startTime;

但我發現對於相同的 I/PI,根據系統負載獲得不同的時間。

那么,如何獲得我的函數執行所需的准確 CPU 時間。

  1. System.currentTimeMillis()只會測量掛鍾時間,永遠不會測量 CPU 時間。
  2. 如果您需要掛鍾時間,那么System.nanoTime()通常比currentTimeMillis()更精確(並且永遠不會更糟currentTimeMillis()
  3. ThreadMXBean.getThreadCPUTime()可以幫助您找出給定線程使用了多少 CPU 時間。 使用ManagementFactory.getThreadMXBean()獲取ThreadMXBean並使用Thread.getId()查找您感興趣的線程的id 。請注意,不需要每個 JVM 都支持此方法!

隨着 JVM 預熱,所花費的時間會有所不同。 第二次運行它總是比第一次更快。 (第一次必須加載類並調用靜態塊)在您運行該方法 10,000 次后,它將再次更快(將代碼編譯為本機代碼的默認閾值)

為了獲得可重現的微基准平均計時,我建議您忽略前 10,000 次迭代並在此之后運行 2-10 秒。

例如

long start = 0;
int runs = 10000; // enough to run for 2-10 seconds.
for(int i=-10000;i<runs;i++) {
    if(i == 0) start = System.nanoTime();
    // do test
}
long time = System.nanoTime() - start;
System.out.printf("Each XXXXX took an average of %,d ns%n", time/runs);

非常重要:每個方法只執行這些循環之一。 這是因為它根據使用方式優化了整個方法。 如果你有一個這樣的繁忙循環,后面的循環會顯得更慢,因為它們沒有運行並且優化得不好。

進行微基准測試的正確方法是了解並正確使用Java 微基准測試工具 (JMH) ,從 OpenJDK 12 開始, JEP 230 微基准套件對其進行了擴充。 搜索“java jmh”將產生一些有用教程的鏈接。 我喜歡Jakob Jenkov 的博客文章,當然還有Aleksey Shipilëv 的任何東西,他是 JMH 的主要開發者和維護者。 只需在提供的鏈接上選擇他的 JMH 演講的最新版本。

Java 基准測試絕非易事,您測試的代碼所做的工作越少,兔子洞就越深。 在試圖解決性能問題時,時間戳可能會非常具有誤導性。 時間戳起作用的一個地方是當您嘗試測量外部事件的等待時間(例如等待對 HTTP 請求的回復以及此類事情)時,只要您可以確保在兩個事件之間花費的時間可以忽略不計等待線程的解除阻塞和“之后”時間戳的獲取,只要線程首先被適當地解除阻塞。 這通常是當且僅當等待時間至少為數十毫秒的情況下。 如果你在某件事上等待幾秒鍾,你就很好。 盡管如此,任何一天都會發生預熱和緩存效應,並破壞您的測量對實際性能的適用性。

在測量“確切的 CPU 時間”方面,可以采用 Joachim Sauer 的回答中詳述的方法。 使用 JMH 時,可以在外部測量 CPU 使用率,然后根據測量的迭代次數求平均值,但是由於這將包括線束的開銷,該方法適用於比較測量,但不適合推導出“我的函數 xy,平均而言” , 在我使用過的 CPU 架構上的每次迭代中都需要花費如此多的 CPU 秒數。”。 在現代 CPU 和 JVM 上,幾乎不可能進行這樣的觀察。

有許多分析器(Jprofile、Jprobe、Yourkit)可用於分析此類數據。 不僅如此,還有更多……(例如內存利用率、線程詳細信息等)

你可以在這里尋找答案:

如何在 Java 中為方法的執行計時?

有很多例子可以計算方法的執行時間

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM