我一直在开发一个单独的基础模型。所有你需要知道的是个体出生,繁殖和死亡。我有一个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