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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS制作日历小事件和数码时钟--JavaScript实例集锦(初学)

运用JS的innerHTML&#xff0c;和for循环实现日历小部件内容和日期的转换。 <!DOCTYPE html> <html> <head><title>日历小部件</title><style type"text/css">*{padding: 0;margin:0;}.tab{width:220px;background: #ccc;height…

Django-认证系统

知识预览 COOKIE 与 SESSION用户认证 回到顶部COOKIE 与 SESSION 概念 cookie不属于http协议范围&#xff0c;由于http协议无法保持状态&#xff0c;但实际情况&#xff0c;我们却又需要“保持状态”&#xff0c;因此cookie就是在这样一个场景下诞生。 cookie的工作原理是&…

jpa 查询 列表_终极JPA查询和技巧列表–第3部分

jpa 查询 列表在阅读第三部分之前&#xff0c;请记住本系列的第一部分和第二部分 JPA&#xff1a;通过查询创建对象 JPA允许我们使用所需的值在查询内创建对象&#xff1a; package com.model;public class PersonDogAmountReport {private int dogAmount;private Person per…

java 限制文件大小_java上传文件大小限制

win系统下解决ASP上传文件大小限制200K_电脑基础知识_IT/计算机_专业资料。win系统下解决ASP上传文件大小限制200K 解决ASP 上传文件大小限制 200K win2003 系统下的 ......介绍 上传 // 新建一个 SmartUpload 对象 SmartUpload su new SmartUpload(); // 上传初始化 su.initi…

java 数组的get set_java.lang.reflect.Array.setBoolean()方法

java.lang.reflect.Array.setBoolean(Object array, int index, boolean value)方法将指定的数组对象的索引组件的值设置为指定的布尔值。声明以下是java.lang.reflect.Array.set(Object array, int index, boolean value)方法的声明。public static void setBoolean(Object ar…

poj3984 迷宫问题 bfs 最短路 广搜

迷宫问题Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 27913 Accepted: 16091Description定义一个二维数组&#xff1a; int maze[5][5] {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};它表示一个迷宫&#xff0c;其中的1表示墙壁…

使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行

红帽公司最近发布了一个微服务集成工具包&#xff0c;用于在OpenShift v3的Docker和Kubernetes环境中运行我们的微服务。 为了帮助人们更好地理解这一点&#xff0c;我将Rider Auto应用程序迁移到一组微服务中&#xff0c;该应用程序已经存在了一段时间&#xff0c;该应用程序用…

python之字符串连接

join 就属于技巧了&#xff0c;利用字符串的函数 join 。这个函数接受一个列表&#xff0c;然后用字符串依次连接列表中每一个元素&#xff1a; str_list [Pyt, hon] a print a.join(str_list)步骤&#xff1a; 1、建立一个列表 2、利用 join() 原文链接  转载于:https://…

JAVA取钱多线程实验_JAVA多线程----用--取钱问题2

在该示例代码中&#xff0c;TestAccount类是测试类&#xff0c;主要实现创建帐户Account类的对象&#xff0c;以及启动学生线程StudentThread和启动家长线程GenearchThread。在StudentThread线程中&#xff0c;执行的功能是每隔2秒中取一次钱&#xff0c;每次取50元。在Genearc…

Spark1——介绍

1、Spark是什么 Spark是一个用来实现快速而通用的集群计算的平台。 2、Spark是一个大一统的软件栈 Spark项目包含多个紧密集成的组件。首先Spark的核心是一个对由很多计算任务组成的、运行在多个工作机器或者是一个计算集群上的应用进行调度、分发以及监控的计算引擎。 Spark的…

java按输入顺序输出_java 输入3个数a,b,c,按大小顺序输出的实例讲解

java 输入3个数a,b,c&#xff0c;按大小顺序输出的实例讲解题目&#xff1a;输入3个数a,b,c&#xff0c;按大小顺序输出。代码&#xff1a;import java.util.Scanner;public class lianxi34 {public static void main(String[] args) {Scanner s new Scanner(System.in);Syste…

Java 8中HotSpot选项的改进文档

Oracle的 Java 8 的HotSpot实现中引入的一些小但受欢迎的功能之一是在启动器的文档中添加了许多常见的HotSpot Java启动器 &#xff08; java &#xff09;选项/标志。 过去&#xff0c;即使是对某些相当常见的HotSpot JVM选项也感兴趣的开发人员 &#xff0c;不得不潜在地寻找…

sql server数据库课程设计分析

课题&#xff1a;能源管理收费系统 系统功能的基本要求&#xff1a; &#xff08;1&#xff09;用户基本信息的录入&#xff1a;包括用户的单位、部门、姓名、联系电话、住址 &#xff1b; &#xff08;2&#xff09;用户水、电、气数据的录入&#xff08;每个月的数据的录入&a…

Springboot 项目启动后执行某些自定义代码

Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种“开机启动”某些方法的方式&#xff1a;ApplicationRunner和CommandLineRunner。这两种方法提供的目的是为了满足&#xff0c;在项目启动的时候立刻执行某些方法。我们可以通过实现ApplicationRunner和Com…

android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...

Android中的传递有两个方法&#xff0c;一个是Serializable&#xff0c;另一个是Parcelable。Serializable是J2SE本身就支持的。而Parcelable是Android所特有的。二者的使用场景和区别&#xff1a;1)在使用内存的时候&#xff0c;Parcelable比Serializable性能高&#xff0c;所…

[BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集

4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1474 Solved: 521[Submit][Status][Discuss]Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n)&#xff0c;每条边上带有权值。所有权值都可以分解成2^a*3^b的形式。现在有q个询问&…

全新资源素材站源码 功能齐备 界面干净整洁

源码介绍 简单安装说明&#xff1a; 1、整站程序上传后台 2、然后导入数据库文件到数据库&#xff0c; 3、修改conf里面的conf的数据库名字及密码 4、配置伪静态 规则&#xff1a; location ~* \.(htm)$ { rewrite "^(.*)/(.?).htm(.*?)$" $1/index.php?$2…

jBPM和Drools工作台中的用户和组管理

介绍 本文讨论了一项新功能&#xff0c;该功能允许使用集成在jBPM和Drools Workbenches中的直观友好的用户界面来管理应用程序的用户和组。 用户和组管理 在安装&#xff0c;设置和使用此功能之前&#xff0c;本文讨论了一些以前的概念&#xff0c;需要进一步理解才能进一步使…

java懒加载设计模式_java设计模式——单例模式

整理一下设计模式的个人理解。描述单例模式是java中比较常见的一种设计模式&#xff0c;顾名思义为一个类只能创建一个实例&#xff0c;多用于全局对象&#xff0c;如&#xff1a;配置的加载&#xff0c;spring bean加载各种配置(spring容器所有bean默认都是单例)单例的特点为构…

BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

题目链接&#xff1a;BZOJ 洛谷\(O(n^2)\)DP很好写&#xff0c;对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]d[j]1\) for(int j1; j<i; j)if(a[j]<minv[i]&&maxv[j]<a[i])//序列只会变换一次 dp[i]max{dp[j]1}; 转移要满足两个条件&#xff1a;\(a[j]…