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

Java-调用静态方法与手动内联-性能开销

舒宏富
2023-03-14
问题内容

我对是否应该手动内联一些性能敏感算法中称为100k-1百万次的小型方法感兴趣。

首先,我认为通过不进行内联会产生一些开销,因为JVM必须确定是否内联此方法(甚至不能这样做)。

但是,前几天,我用静态方法调用替换了此手动内联代码,并发现性能得到了提高。那怎么可能?这是否表明实际上没有任何开销,而让JVM按其“意愿”内联实际上可以提高性能?还是这在很大程度上取决于平台/架构?

(发生性能提升的示例是用int t = a[i]; a[i] = a[j]; a[j] = t;静态方法调用替换数组swapping()swap(int[] a, int i, int j)。没有性能差异的另一示例是当我内联10个内联方法时,被称为1000000次。)


问题答案:

我看过类似的东西。“手动内联”并不一定会更快,结果程序可能太复杂而无法让优化程序进行分析。

在您的示例中,让我们做出一些疯狂的猜测。当您使用swap()方法时,JVM可能能够分析方法主体,并得出结论,由于i和j不变,尽管有4个数组访问,但仅需要2个范围检查而不是4。t不需要局部变量,JVM可以使用2个寄存器来完成工作,而无需涉及t堆栈上的读/写操作。

稍后,swap()的主体被内联到调用方方法中。那是在先前的优化之后,因此保存仍然存在。调用者方法主体甚至有可能证明i和j始终在范围内,因此剩余的2个范围检查也将被丢弃。

现在,在手动内联版本中,优化器必须立即分析整个程序,变量太多,动作太多,可能无法证明保存范围检查或消除局部变量是安全的t。在最坏的情况下,此版本可能会花费6个以上的内存访问来执行交换,这是
巨大的 开销。即使只读取1个额外的内存,它仍然非常引人注目。

当然,我们没有理由相信手动进行“概述”总是更好,即提取一些小方法,希望它会对优化器有所帮助。

-

我了解到的是,忘记手动进行微优化。不是我不关心微性能的提高,不是我一直信任JVM的优化。就是我绝对不知道该怎么做,弊大于弊。所以我放弃了。



 类似资料:
  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是

  • 问题内容: 请具有PHP经验的人提供以下帮助。在我的代码中的某个地方,我调用了一个非实例化类中的公共静态方法: 但是,我希望有许多这样的类,并根据用户的语言即时确定正确的类名称。换句话说,我有: …,我需要做类似的事情: 我知道我可以将语言作为参数传递给函数,并在一个通用类中处理它,但是由于种种原因,我希望使用其他解决方案。 有人吗?谢谢。 问题答案: 使用call_user_func函数: ht

  • 问题内容: 我有这段代码在做Range Minimum Query 。当t = 100000时,i和j始终在每条输入行中更改,因此在Java 8u60中其执行时间约为12秒。 当我提取一个新方法以找到最小值时,执行时间快了4倍(约2.5秒)。 我一直认为方法调用很慢。但是这个例子却相反。Java 6也演示了这一点,但是在两种情况下(17秒和10秒)执行时间都慢得多。有人可以对此提供一些见识吗? 问

  • 我有一段代码在做最小范围查询。当t=100000时,i和j在每个输入行中总是发生变化,其在Java8u60中的执行时间约为12秒。 当我提取一个新方法来寻找最小值时,执行时间快了4倍(大约2.5秒)。 我一直认为方法调用很慢。但是这个例子显示了相反的情况。Java6也演示了这一点,但是两种情况下的执行时间都要慢得多(17秒和10秒)。有人能对此提供一些见解吗?

  • 本文向大家介绍IOS 静态方法与动态方法详解,包括了IOS 静态方法与动态方法详解的使用技巧和注意事项,需要的朋友参考一下 IOS 静态方法与动态方法详解 1、问题提出      iOS中有静态方法与动态方法,那么两种方法的异同是什么? 2、问题分析      因为每个对象都由相应的数据结构与方法相构成,一个程序可能有多个属于同一个类的对象,而每个对象的数据结构应该是不一的,但方法是相同的,若为每

  • 我的C代码无法找到Java中的公共静态函数调用。它成功地找到了类,没有错误。 我试图将结果返回给回调方法。“5”稍后将被更复杂的内容取代。 我在StackOverflow上似乎也有类似的问题,但是到目前为止没有任何变化似乎有所帮助。也许我有逻辑错误? 我的JNI(更新#2): 此代码包含在此函数中调用的方法中: 我的Java(更新#1): 签名检查: javap-s-pcecutils 公共静态响