在Android上调用方法的成本

时间:2016-04-20 18:13:20

标签: java android performance jvm android-runtime

我创建了一个仅在一个地方调用的方法 - 来自RecyclerView中的onBindViewHolder()。它是一个逻辑的代码单元,我认为将该代码块提取到一个方法中可以提高可读性。但是,在代码审查期间,我被告知方法调用很昂贵,因此会对性能产生负面影响,我应该内联代码而不是将其放在单独的方法中。

我认为JVM或编译器会通过内联方法来优化此代码,但我不确定Android上的情况是否属于这种情况。我还没有找到关于新ART JVM做什么样的优化的具体信息。

在Android上调用一个如此昂贵的方法,我应该避免使用方法可能多次被调用的地方的可读性?另外,由于DEX方法的限制,正在创建这样的一次性使用方法吗? (此应用已使用multidex)。

这个问题与其他类似的java问题没有重复,因为我特别询问Android上的性能,这有其自身的特性。

2 个答案:

答案 0 :(得分:7)

我完全不同意。从理论上讲,方法调用会增加一些开销。事情必须被推到堆栈然后跳转到方法。但开销很小。

过早优化绝不是一个好主意。对您的应用程序进行基准测试,找出真正的性能问题。我很肯定它不会是因为单个方法调用,即使是经常调用的方法调用。该方法如何实施可能是一个问题,但不是调用本身。

答案 1 :(得分:2)

  

然而,在代码审查期间,我被告知方法调用很昂贵,因此会对性能产生负面影响,我应该内联代码而不是将其放在单独的方法中。

在代码审核期间的任何建议可能没有根据。

  1. 方法调用的成本仅在频繁调用方法时才有意义。

  2. 方法调用的成本取决于编译器/优化器的好坏程度。随着Android编译器的发展,这些将随着时间的推移而发生变化。实际上,方法调用可能会变得更便宜......直到它们达到编译器在优化直接代码时与普通程序员一样好(或者更好)的程度。

  3. 我和您和您的代码审查员的建议是避免过早优化。让您的应用运行,看看它是否运行良好。如果没有,则对其进行分析以确定REAL性能瓶颈的位置,并优化(仅)它们。

      

    在Android上调用一个如此昂贵的方法,我应该避免使用方法可能多次被调用的地方的可读性?

    呃...不。大多数方法调用都不会导致性能瓶颈。事实上,许多性能瓶颈并未对感知性能做出贡献。对于典型的交互式应用程序,只有缓慢/滞后才会影响真正重要的用户体验。

    任何一个大小适合避免方法调用的所有建议都缺少重点。

    代码,测试,测量,配置文件......然后进行优化。