Joymine 2020-03-05
以下是在论坛整理出来的答案:
1.从编译过来来看,JAVA是将.java文件编译成.class文件,运行的时候再由java虚拟机将.class文件进一步编译成对应的机器码进行指令调用。而c语言会预编译成预编译文件,再编译成汇编语言,二进制文件。直接和机器打交道。运行时中间省略了java的很多步骤。
2.C程序大部分时间会比Java快,但是获得的效率有限。Java较慢主要是JIT编译器需要时间编译Java字节码,以及gc可能影响效率,不过现在的Java比起以前以及大有改观了。
3.由于JIT技术的进步,纯计算上Java和C差距很小,但是Java和C的代码不可能完全等效,因为两者内存管理的机制不同,C可以完全控制内存管理,而Java主要靠JVM的GC功能,这导致Java的运行效率比较稳定,而C的运行效率和代码质量密切相关。高质量的C会比高质量的Java快,但低质量的C很可能回比低质量的Java更慢。
其实单纯比速度并不是特别公平,因为Java天生有多线程(JIT和GC),而且内存使用量一般Java明显要多。
4.C语言是编译型的语言,而JAVA语言则是解释型的语言,因此JAVA语言要被翻译二进制的语言代码后,计算机方能辨识并执行。一般来说呢,c语言是比Java要快,不过因为c语言运行的过程是进程型的,而Java语言是线程型的,因此如果客户的访问量非常大,那么反而java显得更合适。
【引申】
C语言是编译型的语言,Java语言则是半编译半解释型的语言。两者层次不一样,决定了运行速度不一样。那既然C语言运行速度更快还要用Java呢?因为Java的面向对象封装特性有利于提高软件的开发速度和编程感受。
举个栗子:
人需要吸收能量才能正常生活,直接喝葡萄糖、氨基酸更容易吸收、节省时间呀,但为什么人们还是喜欢做出各种菜肴慢慢品尝呢?因为虽然葡萄糖、氨基酸吸收快、转换效率高,但是不好吃呀,不能满足人们的审美需求,所以才需要更高级的食物,逐步消化,最后同样达到为人体提供能量的目的。【此处我并不认为他举的例子很妥帖,但是想要表达的意思,还是能勉强理解】
总结:
如果注重运行效率,觉得葡萄糖、氨基酸不难吃的话,用C语言写大程序完全没问题,C语言同样可以实现面向对象。如果注重开发速度,不想加班,想吃更好吃的菜肴,就应该选择例如Java这类强封装性的语言。
5.C快是毋庸置疑,不过我认为运行时编译这点性能损失可以忽略的,编译只有一次,之后的调用就是直接执行CPU指令,而java的编译优化很强,有些情况编译出的CPU指令比C还少,不过java的内存占用是真大。
6.从最根本上说,就是同样的代码,经过编译后java程序要比C程序的二进制代码多,所以cpu必须花更多的时间去运行这些代码,至于为什么多,就是java的编译器要做很多其他的操作,这些操作为程序员提供了方便,但也增加了代码的数量。
7.C和Java的运行效率现在对比起来应该没有太大差别了吧
另外,Java应用领域和C的大不相同,应用程序运行的瓶颈一般不在自己本身了。
【比如】一个功能模块,C 程序运行要1毫秒,Java运行要10毫秒,但这个模块需要与一台远程主机进行通信,或者要进行大量的数据库访问,几个来回要100毫秒。在这种情况下,怎么提高通信效率,减少通信次数,或者进行数据库优化才是应该主要关注的。这也是Java应用程序主要关注的问题。
还有,单纯的考虑程序运行快慢问题肯定是不够的。比如两个功能相同的系统,A系统响应一次用户的请求要10毫秒,B系统响应一次客户请求要100毫秒,而现实中,10毫秒和100毫秒对人来说基本上分别不出来;另外,如果A系统初始上线时非常快,但半年到一年之后,响应速度明显下降,而B系统初始上线响应不如A快,但两三年之后还是保持相同的响应效率;或者,10来人同时使用时,A平均10毫秒,B平均100毫秒,但同时100人使用时呢?