這是一個非常奇怪的問題。我想知道運行這個Java程序時產生很多滯後的最佳方式。無論計算機的速度如何,我都希望這個Java程序在程序停止之前引起煩人的處理器滯後。我如何保證做到這一點?什麼是最有效的方法?如何在Java中創建滯後?
到目前爲止,我已經與比較成功的唯一事情就是
while (true) {}
但即使這樣,有時是不可靠的,如果用戶的計算機速度快。
我正在使用它來進行一些科學實驗,瞭解一組計算機可以處理多少個科學實驗。
這是一個非常奇怪的問題。我想知道運行這個Java程序時產生很多滯後的最佳方式。無論計算機的速度如何,我都希望這個Java程序在程序停止之前引起煩人的處理器滯後。我如何保證做到這一點?什麼是最有效的方法?如何在Java中創建滯後?
到目前爲止,我已經與比較成功的唯一事情就是
while (true) {}
但即使這樣,有時是不可靠的,如果用戶的計算機速度快。
我正在使用它來進行一些科學實驗,瞭解一組計算機可以處理多少個科學實驗。
我不知道我確實明白你想要什麼,但它是不可能的,你會得到它使用sungle線程和無盡的空循環。首先,該程序至多會使用一個系統線程,並因此使用單個CPU內核。其次,熱點編譯器可能會優化掉你的空循環(或任何算術運算或分配給永遠不會使用的變量)。所以,你想要完成什麼,你需要做一些優化器不會嘗試改進的東西。所以...
如果你想減慢程序的執行速度(而不是電腦),然後圍繞一些Thread.sleep(1000)。 JVM會將這段時間放回到操作系統。
如果您的意圖是讓JVM在等待某個外部事件(如在「系統計算bogomips」)中執行一些工作,那麼您應該運行會產生副作用的代碼,以便優化器贏得「刪除無用的變量分配。例如,你可以對數組做一些算術運算,然後對該數組的任何值進行System.out.print()(或其他)。但是請注意,你的進程仍然只限於一個線程,並且如果你的進程長時間不執行IO操作,那麼它很可能會被操作系統所優化,所以不要期望這種類型的測量技術。
如果您正在尋找拖延整個系統的方法,那麼您必須運行多個線程,並讓它們執行密集的內存分配,IO操作或外部程序執行。例如,你可以運行數千個線程,每個線程運行一個循環,執行一個外部Java程序,分配巨大的緩衝區,然後將該緩衝區的內容寫入一個文件中......嗯,你明白了;)
你也可以睡覺當前的線程。這不會造成延遲,但會給程序帶來影響。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
你可以欣賞我最近發佈的解決Techniques for causing consistent GC Churn的效用。我使用此實用程序來模擬基準測試期間系統的負載,這聽起來與您正在做的工作非常相似。
它創建並銷燬大量對象一段時間或連續在後臺,並可配置爲在JVM上施加不同程度的壓力。嘗試一次運行幾個是額外的意思:)
完整的代碼在這裏可用:GC Churn Gist。
相當諷刺你的暱稱。爲什麼不嘗試緩慢而經常地閱讀某些內容? – icedwater
這是一個荒謬的問題,但確定。創建一堆線程並將其全部運行,所有執行都是無限循環。它會產生很多「滯後」,然後最終崩潰的JVM – Kon
哈哈是的這很奇怪,但我正在做一些實驗,看看有多少某些電腦可以處理。 – Confiqure