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中,字节码的来源无关紧要。 由于所有这些都存在于正在运行的JVM中,因此JIT可以对其核心内容进行优化。 当然,C语言有一个肮脏的技巧可以减轻这种痛苦:Marcos。 在我看来,这就是市长的原因之一,为什么C中如此之多的库仍然使用宏而不是适当的功能-伴随着它们带来的所有问题和麻烦。

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

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

java 代码运行速度慢

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

  1. java 反查域名_C段查询雏形之在Java中反查一个IP上的所有域名(旁站查询)

    这里使用了两个接口来反查IP,分别是"站长工具"和"爱站"的接口,两者各有千秋,结合起来查询就较为准确了. 注:我目前只写了个初始版本,还不太完善,但是可以基本 ...

  2. java工程如何跑起来的_你编写的Java代码是咋跑起来的?

    如果你是一名 Java 开发人员,你肯定指定 Java 代码有很多种不同的运行方式.比如说可以在开发工具(IDEA.Eclipse等)中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至 ...

  3. 用java的io做一个代码计数器_Java中的程序计数器是什么

    Java中的程序计数器是什么 程序计数器是当前线程正在执行的字节码的地址.程序计数器是线程隔离的,每一个线程在工作的时候都有一个独立的计数器. JAVA虚拟机管理的内存区域图 1.什么是程序计数器? ...

  4. java贪吃蛇不能回头,儿时回忆!泪流满面,Java 实现贪吃蛇游戏的示例(附代码)...

    image.png image.png java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing控件 创建一个新窗口 JFrame frame = new JFrame(& ...

  5. java中普通代码块,构造代码块,静态代码块的区别及代码示例

    本文转自:http://www.cnblogs.com/sophine/p/3531282.html 执行顺序:(优先级从高到低)静态代码块>main方法>构造代码块>构造方法. 其 ...

  6. Java框架JSON-RPC项目demo代码实战 + JAVA WEB配置虚拟目录(转自21天java web开发)

    Java框架JSON-RPC项目demo代码实战 备注  JAVA WEB配置虚拟目录(转自21天java web开发) https://blog.csdn.net/wjxbj/article/det ...

  7. Java中普通代码块,构造代码块,静态代码块区别

    Java中普通代码块,构造代码块,静态代码块区别及代码 示例 //执行顺序:(优先级从高到低.)静态代码块>mian方法 >构造代码块>构造方法. 其中静态代码块只执行一次.构造代码 ...

  8. java字典写实例,基于JAVA的新华字典接口调用代码实例

    基于JAVA的新华字典接口调用代码实例 接口描述:基于JA V A的新华字典接口调用代码实例 接口平台:聚合数据 import java.io.BufferedReader; import java. ...

  9. java代码中何处以main开始,Gradle-user guide-第7章 Java 快速开始

    第7章java快速开始 7.1java插件 我们知道,Gradle是一个多用途的构建工具,它可以构建你想在构建脚本中实现的任何事情.不过,作为开箱即用的产品,它不会做任何构建脚本不包含的任务. 大多数 ...

最新文章

  1. android app电量分析,如何计算android app的耗电量?
  2. linux导入函数包失败,使用qsub运行shellscript时出现apos;文件意外结束apos;和apos;错误导入函数定义apos;错误 中国服务器网...
  3. java 多线程性能_Java中多线程的性能比较
  4. 服务器 风扇测试软件,图解服务器风扇安装的正确方法
  5. BZOJ 1270: [BeijingWc2008]雷涛的小猫( dp )
  6. 组合算法 C++高效实现 (二进制辅助法)
  7. 微信公众平台开发中提示“该公众号提供的服务出现故障”问题解决
  8. Zemax—波长1550nm不在所选玻璃色散公式的有效范围内
  9. vue中使用使用阿里云的iconfont
  10. 关于transmission下载速度提升的小建议
  11. python求几何平均_算术平均、几何平均、调和平均、平方平均和移动平均
  12. [印刷工艺]从正度纸,大度纸说起
  13. 移动应用的黑盒测试(1)
  14. 【不全】网络工程师术语表
  15. MetaMask钱包登录Ganache-cli内的账户,出现无法获取链 IC,您的 RPC URL 地址是正确的么?问题
  16. 大量的Oracle数据库视频教程提供下载
  17. 2015年第六届蓝桥杯B组(C/C++)预赛题目及个人答案
  18. Jmeter+Ant 接口自动化环境配置指南
  19. c语言字典大全,c语言字典(C language dictionary).doc
  20. 航班编程代码c语言,航班查询系统C语言源程序

热门文章

  1. P2048 [NOI2010] 超级钢琴(RMQ 贪心)
  2. nssl1438-战略威慑【枚举,树的直径】
  3. 【dfs】树(jzoj 2753)
  4. CERC2017 Gambling Guide,最短路变形,期望dp
  5. 操作系统复习笔记 06 CPU Scheduling CPU调度
  6. 面试官问我:Redis 内存满了怎么办
  7. java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一)
  8. JDK8新特性之Lambda表达式
  9. 老师,我们想看到您的笑容!
  10. 为了金秋那沉甸甸的麦穗,我绝不辜负春天