簡體   English   中英

Java-測量方法執行時間

[英]Java - Measuring Method Execution Time

我正在嘗試使用計時器來測量算法的復雜性,以測量執行時間,同時更改輸入數組的大小。

我目前擁有的代碼非常簡單:

public void start() {
    start = System.nanoTime();
}

public long stop() {
    long time = System.nanoTime() - start;
    start = 0;
    return time;
}

它看起來可以正常工作,直到數組的大小變得很大為止,而我期望是O(n)復雜度算法的結果似乎是O(n ^ 2)。 我認為這是由於CPU上的線程,而其他進程在運行期間會以更大的n值插入更多時間。

基本上,我想測量進程運行了多少時間,而不是自從調用算法以來經過了多長時間。 有沒有簡單的方法可以在Java中做到這一點?

測量執行時間是一個非常有趣但又很復雜的話題。 要使用Java正確地做到這一點,您必須對JVM的工作原理有所了解。 是developerWorks上關於基准測試和測量的好文章。 閱讀它,對您有很大幫助。

作者還提供了一個用於進行基准測試的小型框架。 您可以使用此框架。 它將為您提供所需的信息-CPU消耗的時間,而不僅僅是之前和之后的兩個時間戳。 該框架還將處理JVM預熱,並將跟蹤實時編譯。

您還可以使用性能監視器像這樣一個為Eclipse。 這種性能監視器的問題在於,它不執行基准測試。 它僅跟蹤您的應用程序當前使用的時間,內存等。 但這不是一個真實的度量-只是特定時間的快照。

在Java基准測試是一個很難的問題,尤其是因為JIT可以有怪異效果的方法受到越來越多的大量優化。 考慮使用諸如Caliper之類的專用工具。 有關如何使用它以及如何測量不同輸入大小下的性能的示例在此處

如果您想要當前線程(或實際上是任何任意線程)的實際CPU時間而不是掛鍾時間,則可以通過ThreadMXBean獲得。 基本上,從一開始就這樣做:

ThreadMXBean thx = ManagementFactory.getThreadMXBean();
thx.setThreadCpuTimeEnabled(true);

然后,每當要獲取當前線程的已用CPU時間時:

long cpuTime = thx.getCurrentThreadCpuTime();

您將看到ThreadMXBean也具有調用來獲取CPU時間和任意線程的其他信息。

關於計時復雜性的其他評論也適用。 單獨調用一段代碼的時間除其他因素外,還取決於CPU的狀態以及JIT編譯器在該特定時刻決定執行的操作。 算法的總體可伸縮性行為通常是在多次調用中出現的趨勢,您將始終需要為時序中的某些“異常值”做好准備。

此外,請記住,僅僅因為一個特定的時間在納秒表示 (或實際上毫秒)並不意味着時序其實有粒度。

暫無
暫無

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

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