2010-09-12 85 views
21

我需要一些可以輕鬆實現的單CPU和內存密集型計算,我可以在java中爲測試線程調度程序進行編寫。CPU密集計算示例?

他們應該稍微耗時,但更重要的是資源消耗。

任何想法?

+0

@Martin:大家都知道那就是42. – 2010-09-12 01:13:23

+0

@Martin:「42 + 0 =?」聽起來像是一個很好的選擇:)對不起,發送meursault的問題,我發現它太有趣,不能抵擋。我現在就停下來去檢查我的百萬只猴子和打字機在地下室裏的項目。 – 2010-09-12 01:27:13

回答

21

的CPU密集型任務的幾個簡單的例子:

  • 尋找素數(涉及大量的BigInteger師)
  • 例如計算階乘大2000! ((涉及大量BigInteger乘法)
  • 許多Math.tan()計算(這很有趣,因爲Math.tan是本地的,所以您使用兩個調用堆棧:一個用於Java調用,另一個用於C調用。)
6

乘以兩個矩陣。矩陣應該很大並且存儲在磁盤上。

字符串搜索。或者,索引一個巨大的文檔(檢測並計算每個單詞或字母串的出現次數)例如,您可以爲大型軟件項目的源代碼中的所有標識符編制索引。

計算pi。

旋轉2D矩陣或圖像。

壓縮一些大文件。

...

+1

或者只是在N秒內追加到StringBuilder的forloop。 – tidwall 2010-09-12 00:13:26

+0

這也會涉及到很多的IO,所以資源消耗會比CPU強烈的IO激烈 – vikkyhacks 2016-04-03 16:22:57

4

確定這是不是Java,但是這是基於Dhrystone基準算法發現here。算法的這些實現可能會讓你知道它是如何完成的。鏈接here包含C/C++和彙編程序的源代碼以獲取基準。

1
  1. Official RSA Challenge
  2. 非官方RSA挑戰。 - 抓住一些密文要在純文本閱讀讓電腦在它如果妳使用隨機算法,有一個小但不爲零的機會,你會成功的
6

PDP-11的CPU浸泡測試爲tan(atan(tan(atan(...)))等。對FPU非常困難,並且還有堆棧和寄存器。

3
  • 計算斐波納契數列,其中n是大於70(耗時)大量

  • 計算階乘的第n項。 (費時)

  • 查找所有可能的 兩個節點之間的路徑,如圖所示。 (內存消耗)

+0

我用Java BigInteger嘗試過,甚至計算斐波那契數列中的第5000個數字的速度非常快。 – 2016-06-15 01:38:01

+0

@iamcreasy你可以發佈一些工作代碼來做到這一點(也許在ideone上)?我很好奇它是如何發生如此之快的。 – Rushil 2016-06-15 12:12:46

+0

當然,[這裏](http://pastebin.com/RaqQ9rwm)。如果我犯了一個錯誤,請告訴我。 – 2016-06-15 18:26:50

0

我在搞Java中的線程優先級,並使用下面的代碼。它似乎保持CPU足夠忙,線程優先權有所不同。

@Test 
public void testCreateMultipleThreadsWithDifferentPriorities() throws Exception { 
    class MyRunnable implements Runnable { 
     @Override 
     public void run() { 
      for (int i=0; i<1_000_000; i++) { 
       double d = tan(atan(tan(atan(tan(atan(tan(atan(tan(atan(123456789.123456789)))))))))); 
       cbrt(d); 
      } 
      LOGGER.debug("I am {}, and I have finished", Thread.currentThread().getName()); 
     } 
    } 
    final int NUMBER_OF_THREADS = 32; 
    List<Thread> threadList = new ArrayList<Thread>(NUMBER_OF_THREADS); 
    for (int i=1; i<=NUMBER_OF_THREADS; i++) { 
     Thread t = new Thread(new MyRunnable()); 
     if (i == NUMBER_OF_THREADS) { 
      // Last thread gets MAX_PRIORITY 
      t.setPriority(Thread.MAX_PRIORITY); 
      t.setName("T-" + i + "-MAX_PRIORITY"); 
     } else { 
      // All other threads get MIN_PRIORITY 
      t.setPriority(Thread.MIN_PRIORITY); 
      t.setName("T-" + i); 
     } 
     threadList.add(t); 
    } 

    threadList.forEach(t->t.start()); 
    for (Thread t : threadList) { 
     t.join(); 
    } 
}