我一直在開發一個單獨的基礎模型。所有你需要知道的是個體出生,繁殖和死亡。我有一個GUI,我可以看到這些過程正在發生。java並行化問題 - 並行化和串行化一樣慢
我有一個mac pro,有8個內核和16GB內存。
考慮到仿真必須重複幾次以獲得錯誤等,我以爲我可以運行主類,然後單獨模擬(所有運行在同一程序)運行在不同的核心上。簡單。每個並行仿真都不知道其他仿真,因此不需要同步塊。
當主要方法運行時,它調用主類的構造函數 - 創建其他對象並開始模擬。因此 - 爲了平行 - 我創建了一個固定的線程池,它們將分別調用主類構造函數和多個(好的,8,核心數)仿真。
但是 - 它運行速度慢,就像我在串行模擬運行一樣。每個模擬的GUI中的動畫按順序更新,而不是同時更新。實際上,如果我從命令行同時運行8次程序(並且在'&'的背景中放置),它會更快,行爲更像我所希望的。這是令人討厭的!
在模擬開始時,會執行一些IO操作以讀取有關個人的數據,但只能在開始時讀取。
有趣的是,「並行」進程創建的第一個對象是在相同的內存地址創建的 - 但我認爲這不是問題。
如果有人對java併發工具的性能缺乏有所瞭解,那麼爲什麼程序似乎是以串行方式運行的,爲什麼簡單地從命令行運行8次主要方法比試圖並行化要好是最有幫助的。
因爲坦率地說,我對Java的並行處理能力失去了信心。
乾杯
詹姆斯
noOfProcessors = (byte)Runtime.getRuntime().availableProcessors();
ExecutorService eservice = Executors.newFixedThreadPool(noOfProcessors);
List<Future> futuresList = new ArrayList<Future>();
for(int i = 0; i < noOfProcessors; i++){
futuresList.add(eservice.submit(new simulation()));
}//end for
for(Future future : futuresList){
try{
future.get();
}catch(InterruptedException ex){
Logger.getLogger(simPanel.class.getName()).log(Level.SEVERE, null, ex);
System.exit(1);
}catch(ExecutionException ex){
Logger.getLogger(simPanel.class.getName()).log(Level.SEVERE, null, ex);
System.exit(1);
}//end try-catch
}//end for loop
我能想到的唯一的其他事情就是爲每個線程分配內存 - 我指定了最小和最大堆大小,但也許這還不夠 - 可能每個線程的有限內存都是瓶頸系統? –
您提到的GUI中的某些內容可能導致同步嗎?即整個模擬在Swing事件調度線程中運行還是奇怪的?你可以禁用你的應用程序的GUI部分來排除? – overthink