JAVA比C++更快?

[color=blue][size=large]首先:[/size][/color]我必须承认,我取[color=red]JAVA比C++更快?[/color]为标题是有点故意吸引眼球的意思.
事实上在本文中,我的主要目的不是为了证明或否定[color=red]JAVA比C++更快[/color]这一个结论(事实上标题中的"?"已经隐含了这一点),而是通过引用几位JAVA大牛的文章深入JIT与Hotspot的实现原理,来说明[color=red]为什么JAVA可以比C++更快[/color].当然,在你有你自己的结论之前,我希望你能仔细看一下文中引用的几篇文章,而不是想当然.
[color=red]注意:[/color]文中大部分内容或结论是引用别人的文章,有一些是我自己的看法,文中用[color=green]绿色[/color]标出.
[color=blue][size=medium]1.静态编译与Hotspot动态编译[/size][/color]
[size=small]
[color=green]我们知道,C++相对Basic等解释型语言,之所以性能上有明显的优势,主要是因为C++在运行的时候已经通过编译器编译为二进制的机器语言,并且现代的编译器可以在编译的时候做大量的最优化处理;而Basic等解释型语言运行的时候是通过解释器一步步的解释运行,这样中间隔了一个解释器,速度当然就慢了.[/color]
而JAVA刚出世的时候采取的也是解释执行的方法(现在某些低端设备上的JRE还是解释执行),只不过它比Basic更聪明一点:不是直接解释JAVA源代码,而是先将JAVA源代码编译为一种平台无关的JAVA字节码.这样执行速度可能会比Basic快一些,但相对C++的执行效率还是有很大的差别.
然后,JIT(just-in-time)编译器出现了.JIT编译器在每段代码执行前进行编译,编译的结果为本地静态机器码,执行速度有了质的提高.[color=green]到这儿,我们可以比较一下C++的静态编译与JRE的JIT静态编译:一个是在运行前将代码编译为机器语言,一个是在运行时将字节码编译为机器语言,相比而言,JAVA的JIT编译器还是显得笨一点,预先一次编译比运行时再编译当然要好了.但对于JAVA,为了跨平台,这样做是必须的.[/color]
JIT静态编译器相对解释执行已经有了很大的提高,但是性能仍然和C++有很大的差距.对一段程序,一名优秀的程序员是如何来改进运行速度的呢?首先,他不会傻到把所有的代码都来优化,他会观察、思考到底哪段代码对整体性能影响最大?然后集中精力来优化这一段代码.按照经验,整个程序 10%-20%的代码,会占据 80%-90%的运行时间.用这种方法,在同样的时间、付出同样程度的努力后,这名优秀的程序员使整个程序的性能得到了很大程度的优化.HotSpot引擎,就是模仿人工的这种方法进行优化的.在程序运行的开始,Java代码仍然解释执行,但HotSpot引擎开始进行采样(Profiling).根据采样的结果,决定某段程序是占用较多运行时间的,就认为它是“HotSpot”,它也就是目前程序的瓶颈,引擎开始启动一个单独的线程进行优化.因为不象原始的 JIT编译器那样无差别的编译所有代码,HotSpot引擎可以集中精力来对HotSpot代码进行深度优化,这样这部分代码执行起来更加迅捷.
[/size]

[color=blue][size=medium]2.让我们来看看JIT/Hotspot的工作[/size][/color]
[size=small]
一般来说,JVM或JAVA的标准API没有提供让我们观察Hotspot工作(产生机器码)的接口.所以以前我们只能猜测Hotspot在背后究竟做了那些事情,我们写的JAVA代码被它弄成什么样子了.
不过现在好了,[color=red][url=http://download.java.net/jdk6/binaries/]Java SE Update N[/url][/color]这一系列因为处于开发状态,为了方便debug,这些JVM提供了一个运行参数:[color=red]PrintOptoAssembly[/color],你可以通过如下方式:
[quote]
java -XX:+PrintOptoAssembly -server -cp . Main
[/quote]
运行你的程序,就可以看到这些JAVA程序在编译为机器语言之后的样子.
Kohsuke Kawaguchi做了一些测试,他在博客[url=http://weblogs.java.net/blog/kohsuke/archive/2008/03/deep_dive_into.html]深入JAVA生成的机器码(Deep dive into assembly code from Java)[/url]中进行了一些展示与讲解.并且他对JVM生成的优化代码表示赞赏:
[quote]All in all, modern JVMs seem pretty good at generating optimal code. In various situations, the resulting assembly code is far from the straight-forward instruction-by-instruction translation.[/quote]

JAVA之父James Gosling在他的博客[url=http://blogs.sun.com/jag/entry/hotspot_performance]Hotspot performance[/url]中描述了JIT/Hotspot生成的机器码有以下优点:
[quote]
◇ Really aggressive inlining
◇ Even storage allocation & initialization gets inlined - new T() really is as efficient as C's alloca() (and it beats the pants off malloc())
◇ Careful management of cache prefetching
◇ Deep understanding of variablity between the flavors of x86 machines
◇ Loop unrolling with warmup/cooldown
◇ "theorum proving away" of array index checks (and many other things)
◇ much cleverness with locks

[/quote]
[/size]


[color=blue][size=medium]3.JVM的执行效率可以比C++更高?[/size][/color]
[size=small]
事实上,我认为现在将JAVA与C++比较执行效率没什么太多的意义了.我的意思是,JAVA已经足够快了.而且说实话,经过学C++再学JAVA之后,我已经对C++这门语言避而远之了.
不过为了满足一下某些人的八卦精神,我这里给出几个JAVA与C++的比较:
[url=http://kano.net/javabench/]The Java is Faster than C++ and C++ Sucks Unbiased Benchmark [/url]
[url=http://research.sun.com/techrep/2002/abstract-114.html]FreeTTS - A Performance Case Study[/url]
[url=http://www.tommti-systems.de/go.html?http://www.tommti-systems.de/main-Dateien/reviews/languages/benchmarks.html]Performance comparison C++, C# and Java [/url]
八卦之后,我们来看看为什么JAVA能过这么快呢?
同样,给出几篇介绍JIT/Hotspot工作原理的文章:
[url=http://weblogs.java.net/blog/mlam/archive/2007/02/jit_performance_1.html]JIT Performance: Defying Physics?[/url]
[url=http://www.theserverside.com/news/thread.tss?thread_id=44296]Can JIT'ed Code be Faster than Hardware Accelleration[/url]
[/size]
Arcmap计算土方量教程 1. 创建现状TIN 结果数据: 2. 创建设计TIN 结果数据: 注意:现状TIN和设计TIN构建时候的坐标系不同,设置坐标系见最后的注意事项第1点,就是import(导入)那步骤,现状TIN构建时选择高程点数据或者等高线数据,设计TIN构建时候选择洱海面数据 3. TIN转栅格 改成你要存的数据库,注意中间不要有汉字 结果数据(设计TIN转栅格的同理) 4. 裁剪现状TIN转成的栅格 结果数据: 5. 计算土方量 结果数据: ... 阅读详情

相关推荐

tft_espi 中文字体及自定义字体制作(tft.eSPI模块)

tft.eSPI库自定义字体方法 先下载 processing 然后安装到mixly安装目录下找到tft_eSPI文件夹。

琢磨侠的博客 2764

为什么 c++ 比 java 运行的速度快

最近和同学讨论算法题目的时候,突然讲到为什么 java 的速度比 c++ 慢,当时一知半解,雾里看花。 于是回来之后查了一下资料,整理一下放在这里,方便以后查看。 暂时理解到这个程度,如果以后有新的理解再做补充。 明确原则 首先,我们要明确一个放之世界皆准的原则: 在资源一定的情况下,鱼与熊掌不可得兼。 在程序运行方面,也就是说效率和便捷性往往不能同时满足。 c++ 和 java...

ShiYi's blog 5269

26 硬件工程师笔面试高频考点真题解析——CAN总线

CAN总线是一种差分多主串行半双工总线,采用非破坏性位仲裁机制和五层硬件错误检测(位错误、填充错误、CRC校验、格式错误、应答错误),具有高可靠性和故障容错能力。关键设计包括两端120Ω终端电阻匹配阻抗、手拉手总线拓扑、显性/隐性电平优先级仲裁。常见故障分析指出多节点异常多因终端电阻错配/漏装、星型布线违规或总线过载;高速通讯失败常由阻抗失配或线缆过长导致信号反射。相比RS485,CAN支持多主架构、硬件自动仲裁和节点故障隔离,更适用于汽车、工业等高可靠场景。

XU157303764的博客 550

Java VS C/C++ 运行速度的对比

http://blog.sina.com.cn/s/blog_99baab530102wj4e.htmlJava与C++相比的优点在于:u  Java比C,C++简单,学起来比C\C++容易u  Java完全对象化,比如数组在Java中是一个对象,含有length这个属性;而不像C++中数组是一个指针。所以访问数组,Java都会进行边界检查,更安全,但牺牲了速度。同时因为Java中所有类都会继承O...

runrun117的博客 3万+

NIDS——suricata(一)

NIDS——suricata环境安装和规则编写

weixin_58666006的博客 1273

ANSYS 有限元分析 接触分析

目 录一、前沿二、接触单元类三、接触单元关键选项3.1 CONTA174 KeyOption3.2 TARGE170 KeyOption四、接触分析标准步骤4.1 定义实常数4.2 定义接触和目标单元4.3 创建接触和目标单元五、接触分析实例5.1 MPC5.2 标准接触六、尾声七、参考文献 阿阳的 ANSYS 使用指南,本文仅用于个人学习,除此之外,无其他任何用途。 ANSYS 有限元分析 概述 ANSYS 有限元分析 坐标系/工作平面 ANSYS 有限元分析 几何建模 ANSY

Hulunbuir 4万+

JAVA和C 区别-Java基础-Java-编程开发

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/javascript"

java专栏 492

1.3、云计算HCIP融合存储产品及部署

目标:描述Oceanstor V3系列存储产品系统组成及产品定位 描述Oceanstor V3硬件结构及软件架构 掌握存储系统与主机系统之间的连接 一、存储型号 低端型存储:Oceanstor 2200 2600 2800 V3/V5 终端型存储:Oceanstor 5300 5500 5600 5800 6800 V3/V5 高端型存储:Oceanstor 18000 二、Oceanstor V3系列存储系统定位 OceanStor V3系列存储系统是华为根据存储产品应用现状和存储

weixin_43666279的博客 1655

c 比java快_Java可能比C++快吗?为什么?

这是一段用C++写的计算十万以内的回文素数算法。#include using namespace std;int main(){int input_num=100000;int pp_count=0;for(int each=2; each<=input_num; each++){int factorization_lst=0;for(int factor=1; factor<=eac...

weixin_35989968的博客 521

什么是 AIDV(AI 定义汽车):从软件定义到智能决策的范式革命

AI定义汽车(AIDV),是指以人工智能(尤其是大模型、深度学习、强化学习)为核心引擎,以车载AI芯片为算力底座,以“数据闭环”为迭代支撑,重构汽车感知、决策、执行全链路,实现“感知智能化、决策自主化、体验个性化、迭代自动化”的新一代智能汽车发展范式。其核心是让汽车从“执行工具”升级为“具备自主学习与智能决策能力的移动智能终端”,核心价值是“车与人的深度协同”与“复杂场景的自主适配”。

getusushu的博客 97

【数字IC验证进阶】正则表达式(Regular Expression)快速入门指南

在芯片开发过程中,正则表达式的使用非常常见。初次上手晦涩难懂,多用几次爱不释手!

悟已往之不谏 知来者之可追 1442

java和c++哪个运行速度更快

这个问题并不是很简单,因为它取决于很多因素,例如代码实现、编译器、硬件等。通常来说,C 程序的运行速度比 Java 程序要快,因为 C 是一种编译型语言,它的代码在编译时会生成机器码,运行时直接在硬件上执行,而 Java 是一种解释型语言,它的代码在运行时需要被虚拟机解释,因此运行速度相对较慢。但是,Java 的虚拟机可以利用 JIT (Just-In-Time) 编译技术,将热点代码编译成机器码...

weixin_42605397的博客 1756

《QGIS快速入门与应用基础》209:重叠标注处理(移除/偏移)

系统讲解了QGIS中处理标注重叠问题的核心方法与实操流程。文章首先阐述了重叠标注处理的底层逻辑,即 先预防、再调整、后兜底 的递进式策略,并详细介绍了设置入口与界面布局。重点讲解了偏移处理这一首选方案,包括基础方向设置、最大偏移距离与步长配置、以及自动换行等进阶优化规则。针对不同要素类型(点、线、面)提供了行业规范的偏移方向设置建议,并给出从稀疏到密集场景的完整参数推荐值。最后以城市POI点图层为例,演示了5步偏移设置流程,帮助用户实现 无重叠、无压盖、重点突出 的专业标注效果。

LuckyHanMo的博客 672

Java比C++更快!

转自:http://sailing1987.spaces.live.com/blog/令我兴奋的消息:Java比C++更快!如果我说Java程序的运行速度比C++程序快,你相信吗?我知道你会说“不可能,C++是编译执行的,而Java是解释执行的……Java不可能比C++快……”拜托,现在都二十一世纪了,不要拿这种过时的理论来压人,拿出证据来!无论黑猫白猫,逮着老鼠的才是好猫

yongzhewuwei_2008的专栏 6174

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

多家权威机构、几十篇权威证据证明:Java比C++更快。如果反对,请举反证。

如果我说Java程序的运行速度比C++程序快,你相信吗?我知道你会说“不可能,C++是编译执行的,而Java是解释执行的……Java不可能比C++快……”拜托,现在都二十一世纪了,不要拿这种过时的理论来压人,拿出证据来!无论黑猫白猫,逮着老鼠的才是好猫。是骡子是马拉出来遛遛。不要跟我斗嘴皮子,你跟我斗我还不跟你斗呢~~~~~~~下面举证Java比C++快(资料全部来自网络):多家权威机构、几十篇权

Liigo's blog 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

关于Java和C++哪个更快的问题

郁闷啊,辛辛苦苦打了一篇BLOG转眼间没了..也不知是网页错误还是我那破机的问题.再写一遍吧!蔡学镛先生2000年写的一篇文章(收录于"JAVA夜未眠")里曾提过那时有许多人争论JAVA与C++做出的程序到底哪个更快.2004年底我在优快云上居然还看到人们在争论这个问题,并且用极其幼稚的论据,自相矛盾的观点和不知从哪里引来的恐怕连他自己都看不明白的高深的专业述语.讨论后来变成了狡辩,继而发展成为

all roads lead to top C 1129

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

c++、java/python语言有什么区别?为什么c++更快?

Java语言首先将程序翻译成字节码,之后程序去执行字节码,执行过程中再由翻译器将字节码翻译成机器码去执行,因此执行过程较慢,但好处是换个环境也能执行,不依赖环境。不同操作系统上,系统调用API不同,汇编语言不兼容,汇编语言格式不同操作系统是不同的,目标文件格式不同,因此需要重新编译;换个操作系统/CPU架构/字长/库版本,就需要重新编译;,cpu直接执行机器码,因此高效;python语言是换个环境。

python_girl9475的博客 534

转:多家权威机构、几十篇权威证据证明:Java比C++更快- -

水木尤寒的博客 已锁定- -| 回首页 | 2005年索引 | - -目录树 1.0 for asp(asp+access) 多家权威机构、几十篇权威证据证明:Java比C++更快- -                                        多家权威机构、几十篇权威证据证明:Java比C++更快 以下权威机构的报告证明“Java比C++快”: ...

jimcgnu 1165

Java内联函数(华为面试)-java可能比c++更快

Java内联代码往往表现更加优秀,除非你基于分析器对C++代码进行了大量优化(或者确切地知道如何使用内联让C++更加高效……你肯定会爱上这些头文件!)。 在说内联函数之前,先说说函数的调用过程。        调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并

SoundSlow的博客 1077

为什么Java在大程序里比C++和Rust更快?系统思维取胜

别迷信底层语言:在大规模程序里,Java才是性能王 !Java靠全局优化逆袭C++ ;Rust也没用?大程序里Java反而比底层语言快 !写程序这事,说白了就像搬家。用C++或者Rust这类“底层语言”,相当于你亲自开一辆手动挡小货车,每个路口、每个转弯都得自己盯着,油门离合换挡全得自己来。一开始你觉得掌控一切特爽,但等东西多了、路程远了,光顾着开车就累得半死,根本没精力管路线对不对。而Java就像请了个专业的搬家团队,他们用什么车、走哪条路、怎么装箱最省空间,你都不用操心,你只管说“我要把这些东西搬

极道Jdon的技术博客 185

Java和C++的对照

C++智能指针之weak_ptr

ERAtime的博客 878

Java和C++的性能对比

前两天水群,和别人扯到C++和Java的性能对比,感觉现在好多人已经不再说java慢了,甚至好多人认为java性能已经和C++差不多了。但是正好我司有个模块在尝试java转C++,这就引来大家的一片质疑,后来我在网上找到这样一份数据,大多数情况下C++无论在运行速度还是内存占用,比Java有更大的优势。   最终,我们讨论的结论是,java这些年来在性能上提升了非常多,甚至平均性能已经与C++不相伯仲了,但是在某些对性能要求极高的情况下还是不及C++。也就是说C++的性能天花板要比Java高一些。但反过来,

m0_67402774的博客 1357

java程序解析文件慢_为什么Java比C ++更快地读取大文件?

我有一个2GB的文件(iputfile.txt),其中文件中的每一行都是一个单词,就像:appleredbeautifulsmellsparkinput我需要编写一个程序来读取文件中的每个单词并打印单词计数。 我使用Java和C ++编写它,但结果令人惊讶:Java运行速度比C ++快2.3倍。 我的代码如下:C ++:int main() {struct timespec ts, te;doub...

weixin_42523326的博客 527
上一篇: 在J2ME中模拟C语言中的文件操作
下一篇: 为什么选择Scala?
JavaSxy
博客等级 码龄21年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值