C++/Java在神经网络中的性能表现?

6
我和朋友在午餐时讨论了神经网络(NN),他声称用Java编写的NN的性能与用C++编写的相似。我知道使用“即时”编译器技术,Java可以做得很好,但是我不太相信。有没有人有任何经验可以阐明这个问题?这个页面是我对这个主题的全部阅读内容。

在回答这个问题之前,请记住他正在询问有关神经网络的内容。如果我们坚持讨论手头的主题,我认为我们可以避开整个本地代码与解释器辩论的话题。 - Tim Frey
祝你好运,用C++花费10倍的时间来解决同样的问题。 - mP.
7个回答

11

Hotspot JIT现在可以生成比C++更快的代码了。原因是运行时经验优化。

例如,它可以看到某个循环99%的时间都采用“false”分支,并重新排列机器代码指令。

有很多关于这方面的文章。如果您想了解所有细节,请阅读Sun的精彩白皮书。如需更非正式的信息,请尝试这篇文章


C++可以通过Profile Guided Optimizations实现相同的功能。 - Eric Meadows-Jönsson
这里有一份公正的资料,显示在某些双精度数学工作中(类似于神经网络),Java 比 C/C++ 慢了 19%。http://shootout.alioth.debian.org/u32q/benchmark.php?test=nbody&lang=all - Andrew Bainbridge

2

我对Hotspot JIT和基于配置文件的优化C++之间的比较很感兴趣。

我认为Hotspot JIT(以及任何运行时基于配置文件优化的JIT编译器)的问题在于必须保留统计数据并修改代码。虽然有些情况下这将导致更快的运行速度,但我怀疑在大多数情况下,基于配置文件优化的JIT编译器不会比经过良好优化的C或C ++代码运行得更快。(当然我可能是错的。)

无论如何,通常你会受制于更大的项目,使用与其编写语言相同的语言。或者你将受制于你的同事的知识库。或者你将受制于你所针对的平台(你所针对的架构上是否有JVM可用?)。在很少的情况下,如果你完全自由并且熟悉两种语言,请使用你手头的工具进行比较。那真的是确定哪个更好的唯一方法。


请注意,您还可以对Java代码进行基于配置文件的优化,因此为了公平起见,您需要在两者上都进行基于配置文件的优化或都不进行。 - Jason Cohen
当然可以,但是Hotspot JIT是依据性能剖析进行的(只是在运行时进行的指导)。我想说的是,Hotspot JIT真的应该与基于性能剖析的C或C++编译进行比较(这正是你在评论中对我的观点所持的立场)。 - Kevin

2
唯一可能的答案是:制作一个原型并自行衡量。如果我的经验对你有任何帮助,那么在我所从事的工作中,Java和C#始终比C++慢得多——我认为主要原因是内存消耗高。当然,您可能得出完全不同的结论。

0

可能是C++,尽管我相信你几乎不会注意到除了启动时间慢之外的差异。但是Java可以加快开发速度并使维护更容易。


0
这并不严格涉及C++与Java的性能问题,但在这方面仍然很有趣:一篇关于在垃圾回收环境中运行程序性能的论文

0
如果过度垃圾回收是一个问题,您可以始终重复使用未使用的高频对象。
创建一个工厂,保持对已回收对象的软引用队列,在创建新对象之前使用这些对象。然后在使用这些对象的代码中,明确将这些对象返回给工厂进行回收。

-1
在整个计划中,你正在讨论可能只有5%的性能差异,而如果转向CUDA或专用硬件,你将获得几个数量级的增长。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接