为什么Java中的浮点计算比C慢

为什么Java中的浮点计算比C慢,java,c,floating-point,Java,C,Floating Point,我想知道并研究浮点计算,为什么Java比C慢。事实上,有些算法并没有太大影响。C比Java快3到4倍。但是在浮点计算中有很大的区别。有人能帮我吗?C是编译的,最后变成了机器语言 Java被编译成字节码,然后由Java虚拟机进行解释 根据定义,解释的代码将比汇编的代码慢(您可以认为解释为逐行汇编..重复地,例如,如果在循环中)与Java等高级语言的解释器相比,C等中级语言的编译器足够聪明,可以利用其他技术为相同的功能提供速度,而Java等高级语言的解释器需要额外一层将独立于平台的字节码转换为特定于

我想知道并研究浮点计算,为什么Java比C慢。事实上,有些算法并没有太大影响。C比Java快3到4倍。但是在浮点计算中有很大的区别。有人能帮我吗?

C是编译的,最后变成了机器语言

Java被编译成字节码,然后由Java虚拟机进行解释


根据定义,解释的代码将比汇编的代码慢(您可以认为解释为逐行汇编..重复地,例如,如果在循环中)

与Java等高级语言的解释器相比,C等中级语言的编译器足够聪明,可以利用其他技术为相同的功能提供速度,而Java等高级语言的解释器需要额外一层将独立于平台的字节码转换为特定于平台的程序集

说到这里,虚拟机有它自己的开销,用于维护程序的状态以进行垃圾收集和其他活动,如JVM中的线程调度

更具体地说

Java的浮点运算被五种不必要的错误所破坏 错误:

  • 语言立法的精确再现性充其量只是一厢情愿

  • 在两种传统的混合精度评估策略中,Java选择了更差的策略

  • 在没有IEEE标准754/854规定的浮点陷阱和标志保护的情况下释放无穷大和NaN 与Java声称的健壮性不符

  • Java拒绝授予对当今95%以上的应用程序内置功能的访问权,这削弱了每个程序员的成功前景 浮点硬件

  • Java甚至拒绝了纪律温和的中缀运算符重载,没有中缀运算符重载,算术的扩展就无法实现 数学类型,如复数、区间、矩阵、, 几何对象和任意高精度变得极其复杂 不方便

  • C是本机代码,Java在JVM中运行。现代Java在运行时编译为本机代码,在实际执行计算时应该不会太慢。它的方法是用结果做一些事情,并将结果返回给您,这可能仍然需要比C中最简单的选项更多的开销。没有示例很难评论!如果您只是启动java,进行少量计算,然后再次停止,那么它将以解释字节码的形式运行,并且在所有方面都会相对非常慢。@asumanelif:“大区别”是什么?你能举个例子吗?你是用Float还是Float?将代码从浮点更改为浮点是一个很大的加速。你能举例说明你正在使用的算法类型在Java中的速度非常慢吗?请说明具体的浮点计算,你说有很大的不同。除非你这样做,否则答案将纯粹是猜测。例如,这里有一个浮点计算,其中的差异似乎并不“巨大”,Java代码最终也变成了机器语言。现代JVM有即时编译器,但Java的运行速度通常比C慢。。知道为什么吗?我不是在争论,只是好奇。有很多原因可以解释为什么它通常比较慢。我看不出浮点运算速度慢的原因。在机器代码中有很多不同的计算方法。正如其他人指出的那样,x87指令、MMX指令和使用函数(使用任何一种方法)是否会显著影响性能。如果那篇文章的作者对他们的语言不那么敏感,我可能会费心去读它。但是当他们写“模仿吹嘘推广100%纯Java”时,我不得不怀疑他们的主要目标是否真的是挑起争议并为自己成名。@user949300这些是伯克利的家伙,他们在过去试图抨击Java。:-)因此,这种厌恶与他们自然使用的词语有关:这(至少部分)不是过时了吗?这是在介绍之前写的。@Banthar我不反对你的观点。这就是我在上面的评论中所说的“那些当年试图抨击Java的家伙们”的原因