当前位置: 首页 > 面试题库 >

什么时候Java比C ++快(或者什么时候JIT比预编译快)?

宓英哲
2023-03-14
问题内容

我听说在某些情况下,由于JIT优化,Java程序或Java程序的某些部分比C
++(或其他预编译的代码)中的“相同”代码执行得更快。这是由于编译器能够确定某些变量的范围,避免某些条件并在运行时提取类似的技巧。

您能否举一个(或更佳的)例子,在哪里适用?也许概述了编译器能够优化字节码的确切条件,超出了预编译代码的范围?

注意: 此问题 不是 关于将Java与C ++进行比较。关于JIT编译的可能性。请不要燃烧。我也没有发现任何重复。如果是,请指出。


问题答案:

在实践中,在以下情况下(您亲自观察到的所有情况),您可能会发现天真地编写的Java代码优于天真地编写的C ++代码:

  • 很多很少的内存分配/释放。主要的JVM具有非常高效的内存子系统,并且垃圾回收可能比要求显式释放更为有效(此外,垃圾回收可以转移内存地址,如果确实需要的话)。

  • 通过深层次的方法调用进行有效访问。JVM非常擅长消除不必要的内容,以我的经验,通常比大多数C ++编译器(包括gcc和icc)要好。在某种程度上,这是因为它可以在运行时进行动态分析(即,它可能过度优化,并且仅在检测到问题时才进行优化)。

  • 功能封装到小的短期对象中。

在每种情况下,如果您全力以赴,C 都可以做得更好(在空闲列表和块分配/取消分配的内存之间,C

在几乎每种特定情况下都可以击败JVM内存系统;有了额外的代码,模板和巧妙的宏,您可以非常有效地折叠调用堆栈;并且可以在C
++中使用小的部分初始化的堆栈分配对象,这些对象的性能优于JVM的短期对象模型。但是您可能不想付出努力。



 类似资料:
  • 在同时处理大量任务的超级计算机操作系统中,是否存在SJF策略比FCFS策略花费更长的时间的情况,说到等待时间指标? 可以假设系统中存在不止一个内核。

  • 我知道如果在vanilla js中更改DOM,整个浏览器每次都会进行中继输出和重新绘制。 这是vanillajs测试代码 这是react测试代码 基准结果站点js-framework-benchmark result 和githubsite js-framework-benchmark github

  • 问题内容: 我是这方面的初学者。 我研究过,,和并行线程。 我注意到,这将创建一个线程,这比使用创建新进程要少。另外,线程将与父进程共享文件描述符,内存等。 但是,当是和比并行线程更好?您能举个真实的例子给我解释一下吗? 提前致谢。 问题答案: (和公司)的优缺点是,他们创建了一个新流程,该流程是现有流程的克隆。 正如您所指出的那样,这是一个弱点,因为创建新流程会产生相当大的开销。这也意味着进程之

  • 这里的Better可能意味着更快或更容易阅读/更短的语法,也可能意味着该命令甚至不能在中执行。 我不经常使用,我想知道是否有我应该使用的情况。因为我不经常使用它,所以我能想到的唯一示例是,据我所知,它没有模拟,而且我看到的所有其他示例都在和中完成smth,后者更快、更容易阅读/更紧凑。

  • 本文向大家介绍什么时候用delegate,什么时候用Notification?相关面试题,主要包含被问及什么时候用delegate,什么时候用Notification?时的应答技巧和注意事项,需要的朋友参考一下 答:delegate针对one-to-one关系,并且reciever可以返回值 给sender,notification 可以针对one-to-one/many/none,recieve

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制