2013-10-17 36 views
-5

這是一個非常奇怪的問題。我想知道運行這個Java程序時產生很多滯後的最佳方式。無論計算機的速度如何,我都希望這個Java程序在程序停止之前引起煩人的處理器滯後。我如何保證做到這一點?什麼是最有效的方法?如何在Java中創建滯後?

到目前爲止,我已經與比較成功的唯一事情就是

while (true) {} 

但即使這樣,有時是不可靠的,如果用戶的計算機速度快。

我正在使用它來進行一些科學實驗,瞭解一組計算機可以處理多少個科學實驗。

+0

相當諷刺你的暱稱。爲什麼不嘗試緩慢而經常地閱讀某些內容? – icedwater

+0

這是一個荒謬的問題,但確定。創建一堆線程並將其全部運行,所有執行都是無限循環。它會產生很多「滯後」,然後最終崩潰的JVM – Kon

+0

哈哈是的這很奇怪,但我正在做一些實驗,看看有多少某些電腦可以處理。 – Confiqure

回答

0

我不知道我確實明白你想要什麼,但它是不可能的,你會得到它使用sungle線程和無盡的空循環。首先,該程序至多會使用一個系統線程,並因此使用單個CPU內核。其次,熱點編譯器可能會優化掉你的空循環(或任何算術運算或分配給永遠不會使用的變量)。所以,你想要完成什麼,你需要做一些優化器不會嘗試改進的東西。所以...

如果你想減慢程序的執行速度(而不是電腦),然後圍繞一些Thread.sleep(1000)。 JVM會將這段時間放回到操作系統。

如果您的意圖是讓JVM在等待某個外部事件(如在「系統計算bogomips」)中執行一些工作,那麼您應該運行會產生副作用的代碼,以便優化器贏得「刪除無用的變量分配。例如,你可以對數組做一些算術運算,然後對該數組的任何值進行System.out.print()(或其他)。但是請注意,你的進程仍然只限於一個線程,並且如果你的進程長時間不執行IO操作,那麼它很可能會被操作系統所優化,所以不要期望這種類型的測量技術。

如果您正在尋找拖延整個系統的方法,那麼您必須運行多個線程,並讓它們執行密集的內存分配,IO操作或外部程序執行。例如,你可以運行數千個線程,每個線程運行一個循環,執行一個外部Java程序,分配巨大的緩衝區,然後將該緩衝區的內容寫入一個文件中......嗯,你明白了;)

0

你也可以睡覺當前的線程。這不會造成延遲,但會給程序帶來影響。

try { 
    Thread.sleep(1000); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

More information

+0

這不會產生滯後 – Confiqure

+0

它模擬滯後。 – Oleksi

+0

@Oleksi'sleep'延遲執行;它不會通過超載CPU而落後於整個計算機。 – Vulcan

0

你可以欣賞我最近發佈的解決Techniques for causing consistent GC Churn的效用。我使用此實用程序來模擬基準測試期間系統的負載,這聽起來與您正在做的工作非常相似。

它創建並銷燬大量對象一段時間或連續在後臺,並可配置爲在JVM上施加不同程度的壓力。嘗試一次運行幾個是額外的意思:)

完整的代碼在這裏可用:GC Churn Gist

+0

但是,我不想立即損壞實際的CPU。 – Confiqure

+2

這不是*實際*損害。它只會減慢JVM的速度。 – dimo414