java 编译时长_为什么并行执行对java编译需要在时间上线性增长

Java编译器已经处理了跨可用处理器划分其工作,即使只编译单个文件。因此,并行运行单独的编译器实例本身不会产生您期望的性能提升。

为了演示这一点,我在名为Main1.java的单个文件中生成了一个大型(100万行,10,000个方法)java程序。然后通过Main8.java创建了Main2.java的其他副本。编译时间如下:

单文件编译:

time javac Main1.java & --> (real) 11.6 sec

看到这个单一文件编译在顶部显示处理器使用大多在200-400%范围(指示多CPU使用率,100%每CPU),偶尔尖峰在700%范围(本机最大为800%,因为有8处理器)。

接下来,两个文件同时:

time javac Main1.java & --> (real) 14.5 sec

time javac Main2.java & --> (real) 14.8 sec

所以它只需要14.8秒来编译两个,当它需要11.6秒来编译一个。这绝对是非线性的。很明显,通过查看顶部,而这些运行,每个java编译器只是利用了最多四个CPU一次(偶尔峰值更高)。因此,两个编译器在大多数并行运行的八个CPU上运行。

接下来,四个文件同时:

time javac Main1.java & --> (real) 24.2 sec

time javac Main2.java & --> (real) 24.6 sec

time javac Main3.java & --> (real) 25.0 sec

time javac Main4.java & --> (real) 25.0 sec

好吧,这里我们打了墙。我们不能再并行化编译器。四个文件需要25秒,当两个14.8。有一些优化,但它大多是线性时间增加。

最后,八个同时:

time javac Main1.java & --> (real) 51.9 sec

time javac Main2.java & --> (real) 52.3 sec

time javac Main3.java & --> (real) 52.5 sec

time javac Main4.java & --> (real) 53.0 sec

time javac Main5.java & --> (real) 53.4 sec

time javac Main6.java & --> (real) 53.5 sec

time javac Main7.java & --> (real) 53.6 sec

time javac Main8.java & --> (real) 54.6 sec

这实际上比线性更差,因为八个花了54.6秒,而四个只有25.0。

所以我认为这一切的好处是有信心,编译器将做一个体面的工作,尝试优化您的工作,你给它在可用的CPU资源,并试图手动添加额外的并行将有限(如果有)效益。

编辑:

作为参考,我在Oracle的错误数据库中发现了两个条目,关于增强javac以利用多个处理器:

> Bug ID:

JDK-6629150 – 原始投诉,最终被标记为以下内容的副本:

> Bug ID: JDK-6713663 – 建议分辨率,并且基于“已解决的日期”,显示javac中的多处理器支持在2008-06-12添加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值