2011-07-05 46 views
0

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

我能想到的唯一的其他事情就是为每个线程分配内存 - 我指定了最小和最大堆大小,但也许这还不够 - 可能每个线程的有限内存都是瓶颈系统? –

+0

您提到的GUI中的某些内容可能导致同步吗?即整个模拟在Swing事件调度线程中运行还是奇怪的?你可以禁用你的应用程序的GUI部分来排除? – overthink

回答

0

虽然不是太熟悉Java的Executors类,串行的行为似乎表明,你的线程池正在运行在同一处理器上的所有线程。也许这与JVM如何处理线程有关?无论如何,看看你是否可以在Java中创建单独的进程,并看看是否有所作为。