2011-06-07 58 views
7

我有一點創建迷宮的程序。它使用了大量的集合(默認變量,它是不可變的,或者至少用作不可變的)。斯卡拉是否自己做任何事情?

該程序計算30個尺寸增加的迷宮。使用理解(1至30)

由於使用最新版本的並行集合框架成爲可用我認爲給它一個旋轉,希望獲得一些性能。

這種失敗,並且當我調查一點,我發現了以下:

  1. 當沒有任何東西的任何調用遠程運行平行它​​仍顯示出對每一個4芯的約30%的處理器負載我的機器。

  2. 當我用(1到30).par替換範圍1到30時,CPU負載在所有內核(我預期)上升到約80%。迷宮完成的順序變得或多或少是隨機的(我預期)。所有迷宮的總時間保持不變。

  3. 用它們的平行計數器部件替換一些內部使用的集合似乎有效果。

我現在有2個問題:

  • 爲什麼我有所有4個內核紡紗,雖然沒有任何在並行運行。

  • 無論是否平行運行,程序仍然可能會同時運行的可能原因是什麼?有沒有其他明顯的瓶頸,但CPU週期(沒有IO,沒有網絡,充足的內存通過-Xmx設置)

在這個任何想法?

+4

您應該製作一個不超過一頁並編譯的例子。否則,這只是太多的猜測。垃圾收集器是唯一可以在沒有做任何事情的情況下同時運行的東西。你的程序是否創建了很多對象,在創建後立即收集垃圾?這在功能性編程風格中是相當常見的...... – 2011-06-07 19:54:13

+0

是的,我猜想會創建很多對象,所以GC可能是一個很好的候選對象。我將激活一些日誌記錄並查看它出來的內容。 – 2011-06-07 20:17:03

+0

我看起來我沒有得到任何性能提升,因爲我在等待GC – 2011-06-09 13:52:46

回答

9

30%的核心版本只是一個糟糕的調度程序(聽起來像Windows 7),非常頻繁地將進程從核心遷移到核心。它可能更接近每個核心25%(1/4)的工藝加上其他負載30%。如果你在Linux下運行相同的例子,你可能會看到一個核心掛鉤。

當您轉換爲(1 to 30).par時,您真的開始在所有內核中使用線程,但分配如此少量工作的同步開銷然後收集結果取消了並行增益。你需要將你的工作分解成更大的獨立塊。

編輯:如果1..30中的每一個表示一些更大的工作量(解決迷宮,比方說),那麼如果每個工作單元大致相同,則自動並行化將更好地工作。想象一下你有29個簡單的迷宮和一個非常非常硬的迷宮。第30個迷宮仍將連續(或非常接近)與其他一切運行)。如果你的迷宮數量增加的複雜性嘗試產生他們的順序30 to 1 by -1,使最大的任務將首先。把它看作是解決揹包問題的智慧解決方案。

+0

它是Windows 7.不知道我是否會找到一個Linux來測試您的理論。較大的迷宮(20號以上)需要1秒或更多。所以小塊理論似乎不適用。 – 2011-06-07 20:15:25