Java不是一种解释性语言,而且已经有好几个版本了.Java字节码是实时的.(从技术上讲,它仍然会解释一些代码,但任何对性能有影响的东西都会被JIT’ed)
至于性能,到底是什么让你疯狂地认为"开销是有底线的"?没有,过go 没有,将来也不会有.不是C++和java之间的,不是介于Python和JavaScript之间的,也不是any种其他两种语言之间的.有些特定的版本的JVM会比你的特定的C++编译器更快,而且你的特定C++编译器会比你的特定JVM做得更好.
因此,您 Select 语言的"开销"完全取决于1)您希望代码做什么,以及2)您如何编写代码.
如果使用Java程序并将其转换为C++,结果几乎肯定会运行得较慢.
如果你把一个C++程序翻译成Java,运行速度也会变慢.
不是因为一种语言比另一种"快",而是因为最初的程序是为一种语言编写的,并且是为在that种语言中很好地工作而量身定做的.任何试图将其翻译成另一种语言的try 都将失go 这一优势.最终得到的是C++风格的Java程序,它不能在JVM上高效运行,或者Java风格的C++程序,它也可以运行terribly.
这两种语言规范都不包含"并且结果必须至少比语言y慢x%"的条款.您的C++编译器和JVM都会尽最大努力让事情进行得更快.
然后你今天看到的性能特征明天可能会改变.语言没有速度.
但要回答你的具体问题:
在使用口译员时,开销必须有一定的基准.有什么一般性的经验法则需要记住吗?10%-15%?我偶尔读过博客,说Java代码几乎和本机代码一样快,但我认为这可能是有偏见的.
如上所述,这要视情况而定.对于许多常见的任务,您通常不会看到超过几个百分点的差异.对于某些用例,您会看到更大的差异(不管是哪种方式.在性能方面,两种语言都有优势.JVM有一些开销,但也有巨大的优化机会,尤其是垃圾收集器)
JVM垃圾收集器是否会显著增加运行时性能开销?我知道Cocoa应用程序已经开始使用垃圾收集模型,我同意它使编程变得简单得多,但代价是什么呢?
基本上没有.平均而言,垃圾收集器比手动内存管理少faster倍,原因有很多:
- 在托管堆上,动态分配可以更快地完成
- 共享所有权的处理成本可以忽略不计,在母语中,您必须使用非常昂贵的引用计数
- 在某些情况下,对象销毁也得到了极大的简化(大多数JAVA对象只需通过GC内存挡路就可以回收).在C++中,必须执行always个析构函数,并且几乎每个对象都有一个)
GC的主要问题是,虽然垃圾收集器的平均性能更好,但您失go 了对when的某些控制,从而降低了性能成本.手动内存管理可确保您的线程在等待内存清理时不会停止.垃圾回收器几乎可以在任何时候决定暂停进程并清理内存.在几乎所有情况下,这是足够快的,不会有问题,但对于重要的实时内容,这是一个问题.
另外一个问题是,你失go 了一点表现力.在C++中,RAII被用来管理各种资源.在Java ,你不能使用RAII.相反,GC为你处理内存,而对于所有其他资源,你都被拧紧了,必须自己用很多try /最后块来完成.没有理由为什么RAI3不能在A中实现.GC’ed语言,但在Java或C#中都不可用)
从Java进行系统调用的开销是多少?例如,创建一个与C套接字API相反的套接字对象.
大致相同.为什么会不一样呢?当然,Java必须调用相关的操作系统服务和API,所以开销很小,但您可能真的不会注意到这一点.
最后,我记得在某处读到过JVM实现是单线程的.如果这是真的(我对此持怀疑态度),这是否意味着Java线程真的不是真正的线程?一般来说,java线程是否对应于底层内核提供的线程?Java应用程序是否与本机应用程序从多核/多CPU中获益的方式相同?
Java可以使用多个线程,是的.JVM itself可能是单线程的(在某种意义上,所有JVM服务都在同一个线程上运行),我不知道这一点.但是Java application可以使用任意多个线程,它们被映射到OS线程,并且将使用多个内核.