Java的第一次执行性能

时间:2014-11-17 06:56:41

标签: java performance

我一直在Linux上用C ++开发报表引擎(RE用于生成PDF报表)。如果生成的PDF报告必须包含一些图表,我需要在构建报告时构建它们。 ChartBuilder是用Java编写的(使用Java-TeeChart的JFreeChart - 无论如何都没关系)。好吧,当RE正在构建报告时,它会通过JNI调用一些ChartBuilder-API函数来逐步构建图表(或多个图表)(ChartBuilder打包到.jar文件中)。问题是构建第一个图表需要花费很多时间(也就是说,在进程生命周期中第一次执行每个ChartBuilder-API函数)!更具体地说,构建第一张图表大约需要1.5秒。如果要创建多个图表,则其余图表将在大约(约0.05,~0.1)秒内构建。这比第一个快30倍!值得注意的是,第一张图表与其他图表相同(数据除外)。这个问题似乎是Java的基础(而且我在这个平台上并不是很有经验)。 下面是说明问题的图片:

enter image description here

我想知道是否有办法加快第一次执行。理解如何避免第一次执行的开销会很好,因为它现在阻碍了RE的整体性能。

此外,我想描述它的工作方式:有人使用所有需要的参数调用C ++ RE :: CreateReport。如果需要,此函数会创建一个JVM并通过JNI向它发出请求。创建报告时,JVM将被销毁。

提前致谢!

2 个答案:

答案 0 :(得分:1)

Just-in-time compilation。保持JVM作为服务存活,以避免多次支付JIT编译成本。

答案 1 :(得分:1)

我认为这很可能是人们在评论和其他答案中指出的事情的组合--JVM启动,类加载器,Java'解释'你的代码在运行时等等。

大多数属于“第一次启动”的类别。开销 - 因此在后续运行中具有更高的性能。

我个人倾向于同意Thomas(在你的问题的评论中)最高开销可能是类加载器。

您可以使用一些工具来分析Java JVM,以了解JVM本身花费最多时间的内容 - 例如:

你必须小心使用这些工具来解释结果 - 你可能想要分别测量第一次运行和后续运行,你也可能想要将自己的系统时序添加到包装JNI的C ++代码中要求更好地了解端到端时间。通过性能监控,多次测试运行非常重要,可以出于某种原因(例如计算机上的其他负载 - 即使在非共享笔记本电脑上)也可以进行慢速和快速的单独运行。

正如LeffeBrune所提到的,如果您可以将图表构建器作为服务运行,它可能会加速第一次运行,尽管您可能需要尝试查看它实际上没有运行时会产生多大的差异例如,一段时间的处理器。