与使用C++或C相比,我已经变得越来越习惯用Java编程.我希望能感受到使用JVM解释器而不是以本地方式执行相同的"项目"对性能造成的影响.我意识到这里有一定程度的主观性;程序的质量将在很大程度上取决于良好的实现.总的来说,我对以下几个方面感兴趣:

  • 在使用口译员时,开销必须有一定的基准.有什么一般性的经验法则需要记住吗?10%-15%?(我是凭空得出这些数字的)我偶尔读到博客说Java代码几乎和本机代码一样快,但我认为这可能是有偏见的.

  • JVM垃圾收集器是否会显著增加运行时性能开销?我知道Cocoa应用程序已经开始使用垃圾收集模型,我同意它使编程变得简单得多,但代价是什么呢?

  • 从Java进行系统调用的开销是多少?例如,创建一个与C套接字API相反的套接字对象.

  • 最后,我记得在某个地方读到,JVM实现是单线程的.如果这是真的(我对此持怀疑态度),这是否意味着Java线程真的不是真的线程?java线程通常与底层内核提供的线程相对应吗?Java应用程序是否与本机应用程序从多核/多cpu中受益的方式相同?

任何了解JVM和java程序性能复杂性的开发人员的建议都将不胜感激.谢谢

推荐答案

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线程,并且将使用多个内核.

C++相关问答推荐

C中空终止符后面的数字?

为什么getchar()挂起了,尽管poll()返回了一个好的值?""

exit(EXIT_FAILURE):Tcl C API类似功能

为什么复合文字(C99)的返回会生成更多的汇编代码?

如何创建由符号组成的垂直结果图形?

在C++中头文件中声明外部 struct

在编译时参数化类型定义

如何在C中使printf不刷新标准输出?

调用mProtection将堆栈上的内存设置为只读,直接导致程序SIGSEGV

如何捕捉只有换行符或空格字符缓冲区的边缘大小写

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

强制转换变量以在 struct 中蚕食

使用nmake for程序比Hello World稍微复杂一些

pthread_create的用法

为什么电路板被循环删除?

`预期说明符-限定符-列表在‘(三元运算符中的’token`‘之前

将非连续物理内存映射到用户空间

将数组中的所有元素初始化为 struct 中的相同值

将帧从相机 (/dev/video0) 复制到帧缓冲区 (/dev/fb0) 会产生意外结果