在 Android 上调用方法的成本
Cost of invoking a method on Android
我创建了一个只在一个地方调用的方法 - 来自 RecyclerView 中的 onBindViewHolder()
。它是一个逻辑代码单元,我认为将该代码块提取到一个方法中可以提高可读性。但是,在代码审查期间,我被告知方法调用的开销很大,因此会对性能产生负面影响,我应该内联代码而不是将其放在单独的方法中。
我认为 JVM 或编译器会通过内联方法来优化这段代码,但我不确定 Android 上是否是这种情况。我还没有真正找到任何关于新 ART JVM 进行何种优化的具体信息。
在 Android 上调用一个方法是否非常昂贵,我应该以牺牲可读性为代价在可能多次调用该方法的地方避免它?此外,由于 DEX 方法的限制,创建这样的一次性方法是否令人不悦? (此应用已在使用 multidex)。
这个问题不是其他类似 java 问题的重复问题,因为我专门询问 Android 上的性能,它有自己的特点。
我完全不同意。理论上,方法调用确实会增加一些开销。必须将事物压入堆栈,然后跳转到该方法。但是开销很小。
过早的优化从来都不是一个好主意。对您的应用程序进行基准测试并找出真正的性能问题所在。我敢肯定,这不会是因为单个方法调用,即使是被频繁调用的方法。该方法如何实现可能是个问题,但不是调用本身。
However, during a code review, I was advised that the method invocation was expensive, so it would negatively impact performance, and that I should inline the code rather than putting it in a separate method.
在代码审查期间任何此类建议可能都是没有根据的。
方法调用的成本仅在方法被频繁调用时才重要。
方法调用的成本取决于编译器/优化器的性能。随着 Android 编译器的发展,这些将随着时间的推移而改变。事实上,方法调用可能会变得更便宜......直到它们达到编译器在优化直接代码方面与普通程序员一样好(或更好)的程度。
我对您和您的代码审阅者的建议是避免过早优化。让您的应用正常运行,看看它的性能是否足够好。如果不是,则分析它以确定真正的性能瓶颈在哪里,并(仅)优化它们。
Is invoking a method so expensive on Android that I should avoid it at the cost of readability in places where the method might get called many times?
呃……不。大多数方法调用不会造成性能瓶颈。事实上,许多性能瓶颈并没有影响 感知的 性能。对于典型的交互式应用程序,真正重要的是影响用户体验的只是缓慢/滞后。
避免方法调用的任何一刀切的建议都没有抓住要点。
编码、测试、测量、分析...然后优化。
我创建了一个只在一个地方调用的方法 - 来自 RecyclerView 中的 onBindViewHolder()
。它是一个逻辑代码单元,我认为将该代码块提取到一个方法中可以提高可读性。但是,在代码审查期间,我被告知方法调用的开销很大,因此会对性能产生负面影响,我应该内联代码而不是将其放在单独的方法中。
我认为 JVM 或编译器会通过内联方法来优化这段代码,但我不确定 Android 上是否是这种情况。我还没有真正找到任何关于新 ART JVM 进行何种优化的具体信息。
在 Android 上调用一个方法是否非常昂贵,我应该以牺牲可读性为代价在可能多次调用该方法的地方避免它?此外,由于 DEX 方法的限制,创建这样的一次性方法是否令人不悦? (此应用已在使用 multidex)。
这个问题不是其他类似 java 问题的重复问题,因为我专门询问 Android 上的性能,它有自己的特点。
我完全不同意。理论上,方法调用确实会增加一些开销。必须将事物压入堆栈,然后跳转到该方法。但是开销很小。
过早的优化从来都不是一个好主意。对您的应用程序进行基准测试并找出真正的性能问题所在。我敢肯定,这不会是因为单个方法调用,即使是被频繁调用的方法。该方法如何实现可能是个问题,但不是调用本身。
However, during a code review, I was advised that the method invocation was expensive, so it would negatively impact performance, and that I should inline the code rather than putting it in a separate method.
在代码审查期间任何此类建议可能都是没有根据的。
方法调用的成本仅在方法被频繁调用时才重要。
方法调用的成本取决于编译器/优化器的性能。随着 Android 编译器的发展,这些将随着时间的推移而改变。事实上,方法调用可能会变得更便宜......直到它们达到编译器在优化直接代码方面与普通程序员一样好(或更好)的程度。
我对您和您的代码审阅者的建议是避免过早优化。让您的应用正常运行,看看它的性能是否足够好。如果不是,则分析它以确定真正的性能瓶颈在哪里,并(仅)优化它们。
Is invoking a method so expensive on Android that I should avoid it at the cost of readability in places where the method might get called many times?
呃……不。大多数方法调用不会造成性能瓶颈。事实上,许多性能瓶颈并没有影响 感知的 性能。对于典型的交互式应用程序,真正重要的是影响用户体验的只是缓慢/滞后。
避免方法调用的任何一刀切的建议都没有抓住要点。
编码、测试、测量、分析...然后优化。