2010-07-24 83 views
3

我們的同事之一Peter Mortensen,詢問a question關於超級 用戶關於可能消耗任意百分比CPU時間的應用程序。它激起了我的興趣。控制程序中的計算速度

我的問題是怎麼會這樣的應用進行:

下面是一些我的總體思路,爲什麼我認爲他們是壞:

  1. 計算程序可以做出將使用算法這將是有意無效的。該選項的問題在於應用程序基本上有一個裝備。爲了解決這個問題,我們需要幾種各種效率低下的算法來提供更多的齒輪。不過,用戶將無法選擇50%的利用率。他必須選擇其中一種算法,並查看它在計算機上的表現。
  2. 該應用程序可以使用工作線程進行設置,該線程將不時進入休眠狀態。這樣用戶可以控制線程在每次執行和控制CPU利用率之間休眠的時間。但是,儘管平均利用率是可控的,但線程一方面可能會睡眠或消耗資源,所以它不是很好的解決方案。
  3. 這將是頭號的變體。應用程序可能會以在Java中使用緩存未命中或推測性編譯的方式進行。例如,可以製作一個循環來控制計算,並使其在用戶設置的時間間隔內使緩存未命中。這會減慢計算速度,但實施起來會很困難。或者可以使用Java JIT優化。帶有條件的循環將以JIT優化消除條件的方式執行。一旦條件成立,JIT將不得不優化代碼並執行它。但是如果它存儲了優化版本和未優化版本的代碼,它將只能運行一次。此外,類似的東西需要Java優化的豐富知識才能使其工作。

有關如何使程序故意慢的任何其他想法?

我主要是想在C,C++,C#或Java中實現這樣的東西,但是我擔心C#或Java對於這類問題可能過高。

+0

這是一個很有趣的問題。我忍不住想:「Geez,我應該成爲這方面的專家......」太糟糕了,我的慢代碼不是故意勞動的成果。我多希望我能幫忙。8) – duffymo 2010-07-24 15:22:24

+0

@duffymo是的,這就是我問的原因。我見過的所有CPU燃燒器都盡最大努力提高100%利用率。我記得回到DOS時代,有一種叫做MoSlow的程序或者類似的東西,它讓舊的dos遊戲在新的計算機上運行得足夠慢,但是我對於現代操作系統沒有見過類似的東西。 – AndrejaKo 2010-07-24 15:26:04

+1

相關:http://stackoverflow.com/questions/551494/write-code-to-make-cpu-usage-display-a-sine-wave – jfs 2010-07-24 16:13:39

回答

1

我不知道這是否可行,但我會嘗試做的第一次嘗試是編寫一個燒燬CPU的應用程序,並在該燒錄循環中監視其CPU利用率,以減少CPU使用率的時間片以補償平均利用率何時超過目標百分比。

psuedocode,這樣的事情:

while (true) 
{ 
    double cpuUtilization = GetCpuUtilization(); 
    if (cpuUtilization > 0.5) 
    { 
     Thread.Sleep(0); 
    } 
} 

有可能是我沒有在這裏考慮一些注意事項,但畢竟是從我的頭頂。有一件事,你可能需要在系統中的每個CPU內核的單獨線程中運行一個循環,所以四核系統應該有四個線程,每個線程運行上述循環。

+0

這是一個開始的好主意,但它仍然是停止開始。當然,利用率計使其成爲可用的解決方案,尤其是在精細調整的情況下;但我想看看是否有其他方法可以做到這一點。 – AndrejaKo 2010-07-24 15:31:51

+1

@AndrejaKo:在單一內核中,停止啓動是唯一的方法。 – 2010-07-26 14:23:13

3

假設一個線程和一個核心,在任何納秒,線程要麼正在做某事(100%),要麼正在等待(0%)。部分CPU利用率只能作爲運行和不運行之間的時間平均值。所以,基本上,獲得50%,讓它睡一半時間。睡眠的長度取決於你。