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

HotSpot是否可以优化对纯方法的冗余调用而无需内联它们?

颛孙麻雀
2023-03-14
问题内容

纯方法是没有副作用的方法:它们的唯一作用是返回一个值,该值是其参数的函数

使用相同的参数两次调用相同的纯方法将返回相同的值。因此,给定两次对具有相同参数的纯方法的调用,HotSpot是否可以简单地重用第一次调用中的值来优化第二次调用?

例如:

int add(int x, int y) {
  return x + y;
}

int addTwice(int x, int y) {
  return add(x, y) + add(x, y);
}

如果热点不在线addaddTwice它理解add纯粹的 ,因此呼吁add只有一次,双倍返还价值?

当然,这种琐碎的[mcve]不太可能引起人们的直接关注,但是实际上,由于内联,不同的控制流,自动生成的代码等,类似的情况可能会发生。


问题答案:

到目前为止,HotSpot无法做到这一点。

如果未内联,则对于JIT编译器而言,方法调用通常是不透明的。很难进行跨方法的优化。原因之一是方法入口是易变的,即由于JIT编译,重新编译,反优化,JVMTI调用等,它可以在运行时同时更改。当HotSpot进行显式方法调用时,它不知道目标方法是被解释还是编译,是否收集JIT统计信息,是否正在调试,是否在内部具有断点或是否启用了JVMTI方法事件。

另一方面,即使存在这种优化,也不会太有用。纯方法的功能非常有限,因此它们通常简短而简单,并且有很多机会被内联。内联后,JIT在同一编译范围内进行优化要容易得多。



 类似资料:
  • 问题内容: 假设我有一个Python函数和。旨在以递归方式调用自身。不应递归调用。有没有办法确定是否已递归调用它? 问题答案: 为此使用追溯模块: 因此,如果堆栈中的任何条目指示从调用了代码,则该调用是(间接)递归的。该方法使您可以轻松访问此数据。下面的示例中的语句仅计算函数名称的完全匹配数。为了使它更漂亮(感谢agf的想法),您可以将其变成装饰器:

  • 我试图理解维基百科上规范的DFS伪代码(http://en.wikipedia.org/wiki/Depth-first_search)--特别是使用堆栈的非递归实现。 在BFS中,您在将节点推送到队列之前检查它是否已经被探索过,这保证了不会有节点被多次推送到队列上。但是在DFS中,只有当您将节点从堆栈中弹出时,才会检查它是否已经被探索。这似乎是故意的,正如维基百科页面所说:“[DFS]推迟检查是

  • 本文向大家介绍是否可以从一个static方法内部发出对非static方法的调用?相关面试题,主要包含被问及是否可以从一个static方法内部发出对非static方法的调用?时的应答技巧和注意事项,需要的朋友参考一下 不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个stati

  • 问题内容: 动物是狗的超类,狗有一种叫bark的方法 考虑以下: 会发生什么? the assignment isn’t allowed the call to bark is allowed and “woof” is printed at run time the call to bark is allowed but nothing is printed the call to bark c

  • 问题内容: 我正在尝试修复我的一个程序中的错误,我认为这可能是由于Hibernate弄清楚了如何在不调用其默认(或任何其他)构造函数的情况下实例化对象的实例。 问题答案: 实际上,是的,如果使用objenesis为您实例化对象,则可以在实例化对象时绕过构造函数。它执行字节码操作来实现此目的。 反序列化对象也将绕过构造函数。 使用反射无法做到这一点。

  • 问题内容: 有没有办法绕过python中的类的构造函数? 例: 现在,我想创建一个实例。看起来可能像这样,但是这种语法不正确。 编辑: 一个更复杂的示例: 假设我有一个对象,目的是存储一个参数并对其进行一些计算。但是,该参数并未按原样传递,而是被嵌入到巨大的参数文件中。它可能看起来像这样: 现在,我想转储并加载该对象的实例。但是,在加载该对象时,我只有一个变量,并且无法调用构造函数,因为它需要参数