大家好,今天小编关注到一个比较有意思的话题,就是关于为什么java速度比C语言快的问题,于是小编就整理了2个相关介绍为什么Java速度比C语言快的解答,让我们一起看看吧。
为什么说JAVA比C / c++ 慢?
1.C++是编译型语言,j***a是解释型语言,普遍来讲,编译型语言要比解释型语言速度快。
2.C++是在C语言的基础上增加了新的语法和面向对象的机制,更加接近C语言,也就意味着更加接近底层硬件,越接近于硬件,运行速度越快。
3.j***a是纯面向对象的语言,实现了大量类的封装,体系比较庞大,对于j***a程序员来说,底层硬件可以说是透明的,所以想要优化效率是不容易的。
4.j***a慢于C++的一个重要原因就是j***a是运行在j***a虚拟机上,虚拟机的也需要时间开销。
5.总的来说,C++的效率大概是j***a的3到4倍,但是现在CPU的速度已经很快了,这种几倍的效率问题CPU已经可以完全屏蔽了。
j***a程序和c程序都需要CPU来运行。
区别是c和c++程序编译后的可执行文件是机器码,cpu认识它们,可以直接加载并运行:
j***a程序编译出来的则不是机器码而是字节码,需要由j***a虚拟机先把字节码转化为机器码,然后才能在CPU上运行:
j***a程序--(编译器)->字节码--(虚拟机)->机器码-->运行
j***a比c多了一个从字节码转化为机器码的过程,所以j***a运行慢。
所以说j***a是一种解释性语言,c是一种编译性语言。
的确,不可否认,J***a运行效率上比C/C++是要慢一些,但随着JVM / JIT的不断升级优化,这种速度上的差异会越来越小。
那为什么说J***a比C/C++运行效率上要慢呢?且听我说:
1、J***a是解释型语言、C/C++是编译型语言:
C++可以理解为是C语言的升级扩展版本,C/C++的程序编译出来的是机器码,可以被CPU直接加载执行的;而J***a编译出来的是字节码,然后要通过JIT编译器“翻译”为机器码,然后再被JVM加载执行。J***a中间多了个翻译过程。
两种语言的执行过程大概如下:
J***a:
程序 》编译 》字节码 》JVM 加载处理 》机器码 》执行
C/C++:
程序 》 静态编译器 》 机器码 》执行
2、J***a其实是运行在JVM(虚拟机)上的:
J***a的跨平台其实靠的就是与系统无关的字节码与JVM来实现的,JVM可以理解为是一个虚拟机系统,J***a程序是跑在JVM上面的(JVM底层是用C实现的)。所以J***a的性能还受JVM的配置影响。
而C/C++编译的程序是不需要跑在虚拟机上的。
现在j***a的执行速度和c++相比谁快?你怎么看?
先划一下重点:本问题是纯粹比较运行速度!
看了一下这些回答,有些人可能因为自己是做j***a的,见不得自己做的东西差,死都不承认j***a速度慢。为什么j***a比cpp慢?大家都说得差不多了我不想再啰嗦。我只想从其他方面反过来证明。
首先,j***a程序员是中国所有程序员里最多的!说句不好听的话,如果j***a的运行效率等于或者高于cpp,那么早就不存在cpp这门语言了,因为没有理由用它!cpp的缺点大家都知道,编写效率低(注意是编写效率,不是运行效率!这两者成反比!);复杂难理解;掌握这门语言需要先掌握操作系统;等等。
其次,现在那些追求高性能(也就是高运行效率)的服务器上面跑的程序是用什么语言写的?是c和cpp,没有j***a写的高性能服务器!j***a或者c#或者python或者php写的服务器那是玩玩的,你家oa或者erp或者其他mis可以用这些语言写,但此类系统软件追求的正是编写效率高!追求性能的服务器指的是科学计算类、游戏服务端类等等。
第三,某楼层回答说j***a编写出来的程序最终跟汇编写的程序一样,都是生成了机器码运行。我想问问层主,你懂汇编吗?会使用汇编写代码吗?最终生成的机器码是一样的吗?!你确定j***a生成的机器码不包含有罗里吧嗦一大堆没用的东西,而只有极少的部分是用于做正确的事情?!
我举个例子,同样是上山,比如我用汇编写实现是一条天梯从山底直通山顶,而用j***a实现是山路十八弯。机器码在同一台电脑运行速度一样所以这里人走路的速度一样(注意,任何语言包括解释型语言,其最终都是依靠机器码才能运行。机器码的运行速度一样是说明硬件速度固定,而不是j***a运行速度跟汇编一样!),你说是我走天梯直通上方先到山顶,还是走山路十八弯盘上去快?答案显而易见吧?!我建议该楼主好好看看我的回答,多学习多理解,避免扯淡误导跟您一样无知的萌新!
绝大多数情况下,都是C++比J***A快。前者直接编译成本地机器语言,后者需要虚拟机即时编译。前者没有垃圾回收,后者有垃圾回收。前者可以栈上分配***,后者依赖编译器和虚拟机(不确定性)。
但是也需要清楚,在某些时候,J***A速度更快。这是建立在C++还没有精通或者不想花时间优化的前提下。J***A的虚拟机有时非常智能,它可以自动对代码进行优化。而C++编译器则优化空间较少,它的哲学是把更多的优化机会留给程序员。
J***A虚拟机常见的自动优化有以下这些。自动把某些***放到栈上分配,自动把某些函数设置为内联。还有更厉害的,内存池。***用内存池时(预先分配一大块),内存分配会有一定提速,也防止了内存碎片。还有缓存技术,把一些可能经常用的对象预先分配,以后每次new的时候直接用现成的。也就是表面上看是new了个对象,实际上并没有发生分配内存的动作,而是直接使用全局的一个可以反复重用的对象[_a***_]。还有“写时修改”策略。即克隆一个大对象时,并没有真正克隆(仅仅是复制一个指针),而是直到发现新对象变更时才真正克隆。
这些优化,用C++通通都可以做,而且还可以手动做,不依赖编译器自动优化(J***A通常依赖自动优化,不能手动)。C++要做的就是该栈上分配的就栈上分配,该内联的就内联(内联不了的直接少调用函数,或写成宏)。顺便说一下,J***A似乎都没有栈上分配(除了基本类型)和内联的概念,因为是靠虚拟机自动智能实现的。更加复杂的就是内存池了,自己实现一个内存池。另外还有多用缓存,不要什么东西都从堆上新分配。
但是现实情况是,多数C++程序员都没有这些优化能力,或者即使有也没有那个时间折腾,赶工期嘛。还有一点很重要,性能优化后的代码往往可读性都很差,而且代码变复杂!这就导致了,在某些时候,类似的代码,J***A速度反而更快。
最后,还需要强调,上面说的J***A有时候比C++快,这种情况并不多见。有也是经常发生在C++初学者身上。而且只要是C++代码经过高度的优化,基本上是一定比高度优化的J***A要快的!
我们可以把C++比喻成有强大功能(光圈,变焦,曝光时间等)的相机,而J***A是高度智能的一键式傻瓜式相机。当一个不会手动调参的摄影师用专业相机时,并不一定比一键式傻瓜相机自动调参拍出来的效果好。而一个专业摄影师,则一定拍出来比傻瓜式相机效果好。
理论上一样快,有时候cpp快,有时候j***a快。
注意,我说的可不是“J***a一定比C++快”这种公认荒谬的神论,如果你不知道什么叫“有时”,那么请直接离开这个回答,因为你没资格继续看。
我估计有人肯定听了就不乐意了,什么?j***a一定比cpp慢才对,因为j***a是用虚拟机运行,虚拟机是c/cpp写的,所以可以得出j***a一定比cpp慢!
然而不是,因为j***a不是脚本语言。再次重申,j***a不是脚本语言!而上面提到的思维明显是把j***a当成脚本语言对待了。虚拟机本质上仍然是提供虚拟硬件,有一套自己的处理器指令集,不然你以为还要编译一遍是为了保密?另一个证明是,j***a真的能直接运行在硬件上(有虚拟机,那就一定能造出真机嘛),注意,是真的是直接运行在硬件上而不是什么用硬件集成一套其他语言编写的运行环境再运行。以前有过这种芯片,可惜推出之后没什么市场,最终也就消失在历史中了。不过这已经能证明j***a是基于硬件指令操作而不是基于什么其他高级语言翻译再操作的根本性质了。
有本事你给js或是其他什么脚本语言也造个真机出来?
正是因为这一特性,导致了j***a可以比c++更快。举个最容易理解的例子,c++创建一个对象需要4走个真正的cpu指令,而j***a只需要走1个虚拟机cpu指令。那么,1个虚拟机cpu指令需要用4个真正的cpu指令运行么,显然不需要。
如果看到这,你还是不相信j***a可以比cpp快的,甚至还想在下面留言用各种已经解释了可你还是理解不了的想法来反驳,那这里直接给你做一个随手就能来一个的例子。下面,就分别用cpp和j***a创建一百万个功能完全相同的对象,来测试执行耗时。
测试环境是MacBook pro2016款,jdk1.8.0-131,g++为4.2.1系统自带,clang为10.0.1(更适合编译未经优化的代码),那么结果如何呢?
首先登场的是c++,测试代码如下。可以看出都是最基本的操作,哪怕是初学者都能轻松看懂:
至少能保证在大多数情况下,cpp会快。
原因就是cpp设计稍微底层一些,有些东西由用户裁剪。比如运行时类型信息,异常处理都是可以裁剪的,而且没有垃圾收集,自己选择合适的时机释放内存,当然应该还有其他jvm实现的功能在cpp上没有。
但是j***a建立在更上层的优势就是开发速度更快。语言的高级话更在于解决开发速度。并非解决性能问题。如果某块对性能有,项目自然会转到cpp,c,甚至汇编解决这些问题。
c++写个内存管理肯定c++快吧,不想说什么 乱七八糟的,你拿每次动态内存分配走系统调用的方式和没用内存池的c++比就是搞笑。我主要用j***a,没啥偏见,扬长避短就好。
到此,以上就是小编对于为什么J***A速度比C语言快的问题就介绍到这了,希望介绍关于为什么J***A速度比C语言快的2点解答对大家有用。