前几天我和一位朋友在午餐时讨论神经网络(NN),他声称用Java编写的NN的性能类似于用C ++编写的。我知道,通过'及时'编译技术,Java可以做得很好,但不知怎的,我只是不买它。有没有人有经验可以解释这个问题? This page是我对这个主题的阅读程度。
答案 0 :(得分:10)
Hotspot JIT现在可以比C ++更快地生成代码。原因是运行时经验优化。
例如,它可以看到某个循环在99%的时间内占用“假”分支并相应地重新排序机器代码指令。
有很多关于此的文章。如果您需要所有详细信息,请阅读Sun's excellent whitepaper。有关更多非正式信息,try this one。
答案 1 :(得分:2)
我对Hotspot JIT和配置文件引导优化优化C ++之间的比较感兴趣。
我在Hotspot JIT(以及任何运行时配置文件优化的JIT编译器)中看到的问题是必须保留统计信息并修改代码。虽然存在孤立的情况,但这会导致代码运行速度更快,我怀疑在大多数情况下,配置文件优化的JIT编译器运行速度要比优化良好的C或C ++代码快。 (当然我可能是错的。)
无论如何,通常你会受到更大项目的支配,使用与其相同的语言。或者你将受到同事知识库的支配。或者你将受到你所针对的平台的支配(是你目标的架构上可用的JVM吗?)。在极少数情况下,您拥有完全的自由并且熟悉这两种语言,请与您可以使用的工具进行一些比较。这确实是决定什么是最好的唯一方法。
答案 2 :(得分:2)
唯一可能的答案是:制作原型并自行测量。如果我的经验有任何兴趣,那么Java和C#总是比C ++慢得多,因为我正在做的工作 - 我相信主要是因为内存消耗很高。当然,你可以得出一个完全不同的结论。
答案 3 :(得分:0)
这不是严格意义上的C ++与Java性能,但在这方面仍然很有意思:A paper关于在垃圾收集环境中运行的程序的性能。
答案 4 :(得分:0)
如果需要考虑过多的垃圾收集,您可以随时重复使用未使用的高流失对象。
创建一个工厂,将SoftReferences队列保存到回收对象,在创建新对象之前使用这些对象。然后在使用这些对象的代码中,显式地将这些对象返回工厂进行回收。
答案 5 :(得分:0)
可能是C ++,虽然我相信除了缓慢的启动时间之外你几乎不会注意到这种差异。然而,Java使开发更快,维护更容易。
答案 6 :(得分:-1)
在宏观方案中,你可能会争论5%的性能差异,你可以通过迁移到CUDA或专用硬件来获得几个数量级的增加。