C代码的运行速度总是比Java快,对吧? 错误!
因此,我们都知道,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快,对吧? 错误!相关推荐
- java 代码运行速度慢_C代码的运行速度总是比Java快,对吧? 错误!
java 代码运行速度慢 因此,我们都知道,Java解释缓慢且C的编译和优化运行速度非常快. 您可能知道,情况截然不同. TL; DR Java适用于星座图,它的速度更快,在JIT上可以执行内联,因为 ...
- java快排算法解读,java 快排的思路与算法
java 快排的思路与算法 有时候面试的时候的会问道Arrays.sort()是怎么实现的,我以前根本不知道是什么东西,最近点进去看了一下.直接吓傻, //看到这个时候还是比较淡定的,可怕的事情来了. ...
- java比go难学_为什么Go比Java快这么多?看完这个例子就懂
一,前言 本次小测试并不是试图说明Go是java的替代,Go lang和Java本就不是实现相同类型任务的语言 :Java是企业开发语言,而Go是系统编程语言.为什么Go比Java快这么多?看完这个例 ...
- java快排原理_Java数据结构与算法——快速排序
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中最常用也是面试中最容易考到的排序算法--快排,包括快排的思 ...
- java 快死了_如果Java快死了,那么它肯定看起来非常健康
java 快死了 Java快要死了的奇怪但流行的断言只能在没有证据的情况下提出,而不是因为它. 在酷孩子闲逛的论坛(Hacker News,Reddit等)中反复出现的偏见与Java语言背道而驰. 人 ...
- 如果Java快死了,那么它肯定看起来非常健康
Java快要死了的奇怪但流行的断言只能在没有证据的情况下提出,而不是因为它. 在酷孩子闲逛的论坛(Hacker News,Reddit等)中反复出现的偏见与Java语言背道而驰. 人们常常反复感叹 J ...
- java打怪升级代码_1255: 打怪升级(Java)
Description 对于多数RPG游戏来说,除了剧情就是打怪升级.本题的任务是用最短的时间取得所有战斗的胜利.这些战斗必须按照特定的顺序进行,每打赢一场,都可能会获得一些补药,用来提升力量.本题只 ...
- 算法——java快排(快速排序)
手写java快排(快速排序)代码--双边循环法,本人亲测哈哈!! package com.abc.backend.algo;import java.util.Arrays;/*** 快排(双边循环法) ...
- matlab中调用java代码_Matlab中调用第三方Java代码
在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类.这种方式可以表示为Java--> Matlab( m, Ja ...
最新文章
- 云服务中IaaS、PaaS、SaaS的区别
- 艺考可以报考清华的计算机系吗,考中传的人太多?艺考生或许可以考虑一下清华、浙大...
- php service locator,Yii源码解读-服务定位器(ServiceLocator)
- matlab R2010a windows和linux版本下载地址
- shell脚本遍历分库分表数据
- hdu120118岁生日
- 动手学习深度学习的PDF电子版
- Axure中将不同文件页面合在同一个页面中
- 新xp系统如何链接网络连接服务器地址,xp系统如何设置宽带连接
- 第二篇 在Win10系统上配置有限元框架FEniCS
- Java虚拟机周志明Eason-zhang解读
- python批量合并excel文件,后缀名为xls
- spring-AOP-苍老师
- Coverage Path Planning(区域覆盖)
- Recommended software
- LYOI2018 Hzy's Planets
- Magnetic Actuation for Full Dexterity Microrobotic Control Using Rotating Permanent Magnets
- 2020香港科大百万奖金创赛总冠军思坦科技赛后即成功融资数千万
- 设计计算机系统,紫外可见分光光度计的计算机系统设计
- 通过(半高宽FWHM)方差sigma生成二维高斯函数(PSF)
热门文章
- Java 8 新特性:扩展注解(类型注解和重复注解)
- mysql语句性能开销检测profiling详解
- Maven Optional Exclusions使用区别
- avue中实现消息的实时展示
- 对象拷贝的工具类DeepBeanUtils
- idea报错:Error:java: JDK isn‘t specified for module ‘xxx‘
- 页面复杂对象传递参数 开发中遇到的问题
- python测试开发面试题_python测试开发面试之深浅拷贝
- 特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS
- sql 注射_只能在测试中注射吗?