因此,我们都知道,Java解释缓慢且C的编译和优化运行速度非常快。 您可能知道,图片截然不同。

TL; DR Java适用于星座,它的速度更快,在JIT上可以执行内联,因为所有方法/功能都是可见的,而C编译器无法在编译单元(例如库等)上执行优化。

AC编译器将C代码作为输入,对其进行编译和优化,并生成要执行的特定CPU或体系结构的机器代码。 这导致可执行文件,无需进一步步骤即可直接在给定计算机上运行。 另一方面,Java有一个中间步骤:字节码。 因此,Java编译器将Java代码作为输入并生成字节码,而字节码基本上是抽象机的机器代码。 现在,对于每个(流行的)CPU架构,都有一个Java Virual机器,该机器模拟此抽象机器并执行(解释)生成的字节码。 这听起来很慢。 但是另一方面,字节码是可移植的,因为相同的输出将在所有平台上运行,因此口号“ 一次写入,随处运行 ”。

现在,使用上述方法,它会变得“ 写一次,到处等待 ”,因为解释器会很慢。 因此,现代JVM要做的就是及时编译。 这意味着JVM在内部将字节码转换为用于CPU的机器代码。 但是由于此过程非常复杂,因此Hotspot JVM (最常用的一种)仅对经常执行的代码片段执行此操作(因此命名为Hotspot )。 除了更快地启动(解释器立即启动,JIT编译器根据需要启动)之外,还有另一个好处:热点JIT已经知道经常调用什么部分,什么不经常调用-因此它可以在优化输出时使用它–这就是我们的例子发挥作用的地方。

现在,在查看我的完整示例之前,请注意,Java具有许多功能,例如动态调度(在接口上调用方法),它还带有运行时开销。 因此,Java代码可能更容易编写,但通常仍会比C代码慢。 但是,当涉及纯数字运算时,就像下面的示例一样,有一些有趣的发现。

因此,无需进一步讨论,这是示例C代码:

test.c:

int compute(int i);int test(int i);int main(int argc, char** argv) {int sum = 0;for(int l = 0; l < 1000; l++) {int i = 0;while(i < 2000000) {if (test(i))sum += compute(i);i++;}   }return sum;
}

test1.c:

int compute(int i) {return i + 1;
}int test(int i) {return i % 3;
}

现在,主要功能的实际计算完全不重要。 关键是它经常调用两个函数(测试和计算),并且这些函数在另一个编译单元(test1.c)中。 现在让我们编译并运行程序:

> gcc -O2 -c test1.c> gcc -O2 -c test.c> gcc test.o test1.o> time ./a.outreal    0m6.693s
user    0m6.674s
sys    0m0.012s

因此,此过程大约需要6.6秒 。 现在让我们看一下Java程序:

Test.java

public class Test {private static int test(int i) {return i % 3;    }private static int compute(int i) {return i + 1;    }private static int exec() {int sum = 0;        for (int l = 0; l < 1000; l++) {int i = 0;            while (i < 2000000) {if (test(i) != 0) {sum += compute(i);                }i++;            }}return sum;    }public static void main(String[] args) {exec();    }
}

现在让我们编译并执行以下命令:

> javac Test.java> time java Testreal    0m3.411s
user    0m3.395s
sys     0m0.030s

因此,花费3.4秒的时间 ,Java可以轻松完成此简单任务(甚至包括JVM的缓慢启动)。 问题是为什么? 当然,答案是JIT可以执行C编译器无法执行的代码优化。 在我们的例子中是函数内联。 当我们在自己的编译单元中定义了两个微型函数时,编译器无法在编译test.c时内联这些函数。另一方面,JIT拥有所有方法,并且可以执行主动内联,因此编译后的代码速度更快。

那么,这是一个在现实生活中从未发生过的完全异国情调的虚构例子吗? 是的,没有。 当然,这是一个极端的情况,但是请考虑一下代码中包含的所有库。 所有这些方法都不能在C语言中进行优化,而在Java中,字节码的来源无关紧要。 由于所有JIT都存在于正在运行的JVM中,因此JIT可以对其核心内容进行优化。 当然,C语言有一个卑鄙的技巧可以减轻这种痛苦:Marcos。 在我看来,这就是市长的原因之一,为什么C中如此之多的库仍然使用宏而不是适当的功能-伴随着它们带来的所有问题和麻烦。

现在就在火焰战争开始之前:这两种语言都有其长处和短处,并且在软件工程领域都占有一席之地。 撰写这篇文章仅是为了吸引您的注意,并想知道现代JVM每天都在发生。

翻译自: https://www.javacodegeeks.com/2016/02/c-code-always-runs-way-faster-java-right-wrong.html

C代码的运行速度总是比Java快,对吧? 错误!相关推荐

  1. java 代码运行速度慢_C代码的运行速度总是比Java快,对吧? 错误!

    java 代码运行速度慢 因此,我们都知道,Java解释缓慢且C的编译和优化运行速度非常快. 您可能知道,情况截然不同. TL; DR Java适用于星座图,它的速度更快,在JIT上可以执行内联,因为 ...

  2. java快排算法解读,java 快排的思路与算法

    java 快排的思路与算法 有时候面试的时候的会问道Arrays.sort()是怎么实现的,我以前根本不知道是什么东西,最近点进去看了一下.直接吓傻, //看到这个时候还是比较淡定的,可怕的事情来了. ...

  3. java比go难学_为什么Go比Java快这么多?看完这个例子就懂

    一,前言 本次小测试并不是试图说明Go是java的替代,Go lang和Java本就不是实现相同类型任务的语言 :Java是企业开发语言,而Go是系统编程语言.为什么Go比Java快这么多?看完这个例 ...

  4. java快排原理_Java数据结构与算法——快速排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中最常用也是面试中最容易考到的排序算法--快排,包括快排的思 ...

  5. java 快死了_如果Java快死了,那么它肯定看起来非常健康

    java 快死了 Java快要死了的奇怪但流行的断言只能在没有证据的情况下提出,而不是因为它. 在酷孩子闲逛的论坛(Hacker News,Reddit等)中反复出现的偏见与Java语言背道而驰. 人 ...

  6. 如果Java快死了,那么它肯定看起来非常健康

    Java快要死了的奇怪但流行的断言只能在没有证据的情况下提出,而不是因为它. 在酷孩子闲逛的论坛(Hacker News,Reddit等)中反复出现的偏见与Java语言背道而驰. 人们常常反复感叹 J ...

  7. java打怪升级代码_1255: 打怪升级(Java)

    Description 对于多数RPG游戏来说,除了剧情就是打怪升级.本题的任务是用最短的时间取得所有战斗的胜利.这些战斗必须按照特定的顺序进行,每打赢一场,都可能会获得一些补药,用来提升力量.本题只 ...

  8. 算法——java快排(快速排序)

    手写java快排(快速排序)代码--双边循环法,本人亲测哈哈!! package com.abc.backend.algo;import java.util.Arrays;/*** 快排(双边循环法) ...

  9. matlab中调用java代码_Matlab中调用第三方Java代码

    在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类.这种方式可以表示为Java--> Matlab( m, Ja ...

最新文章

  1. 云服务中IaaS、PaaS、SaaS的区别
  2. 艺考可以报考清华的计算机系吗,考中传的人太多?艺考生或许可以考虑一下清华、浙大...
  3. php service locator,Yii源码解读-服务定位器(ServiceLocator)
  4. matlab R2010a windows和linux版本下载地址
  5. shell脚本遍历分库分表数据
  6. hdu120118岁生日
  7. 动手学习深度学习的PDF电子版
  8. Axure中将不同文件页面合在同一个页面中
  9. 新xp系统如何链接网络连接服务器地址,xp系统如何设置宽带连接
  10. 第二篇 在Win10系统上配置有限元框架FEniCS
  11. Java虚拟机周志明Eason-zhang解读
  12. python批量合并excel文件,后缀名为xls
  13. spring-AOP-苍老师
  14. Coverage Path Planning(区域覆盖)
  15. Recommended software
  16. LYOI2018 Hzy's Planets
  17. Magnetic Actuation for Full Dexterity Microrobotic Control Using Rotating Permanent Magnets
  18. 2020香港科大百万奖金创赛总冠军思坦科技赛后即成功融资数千万
  19. 设计计算机系统,紫外可见分光光度计的计算机系统设计
  20. 通过(半高宽FWHM)方差sigma生成二维高斯函数(PSF)

热门文章

  1. Java 8 新特性:扩展注解(类型注解和重复注解)
  2. mysql语句性能开销检测profiling详解
  3. Maven Optional Exclusions使用区别
  4. avue中实现消息的实时展示
  5. 对象拷贝的工具类DeepBeanUtils
  6. idea报错:Error:java: JDK isn‘t specified for module ‘xxx‘
  7. 页面复杂对象传递参数 开发中遇到的问题
  8. python测试开发面试题_python测试开发面试之深浅拷贝
  9. 特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS
  10. sql 注射_只能在测试中注射吗?