0

After reading several articles on how to fine-tuning my code, I found out that the way we are declaring objects and variables could drasticatly impact the performance of our application. This is more and more important as time constraint is now an integral part of some aspects of the Android platform (e.g. result must be provided within 5 sec for some operations).

Now, I found the following code in one of my fragment class (perfectly functional):

Activity myA = getActivity();
if(myA instanceof MainActivity) {
((MainActivity) myA).doNext();
}

Knowing that objects creation/destruction and ressources allocation are some of the factors contributing to drain-out the device’s batteries, I had in mind to rewrite my code to:

if(getActivity() instanceof MainActivity) {
((MainActivity ) getActivity()).doNext();
}

From a functional perspective, both codes are delivering the same results. However, what is the most suitable approach? I’m asking because I see pros and cons to both approach and I’m unable to find the appropriate way to evaluate the performance and I’m also not clear on which counters (memory usage, function' speed, used CPU cycles, etc) the evaluation should be performed.

Thanks for your contribution in advance.

4

5 回答 5

4

猜测可能是性能瓶颈是非常常见的浪费时间。您必须衡量对整个程序有影响的因素,而不是猜测。

知道对象的创建/销毁是因素之一

创建一些对象并不重要。创建太多对象很重要。您应该使用分析器来确定多少是太多以及创建最多的对象。

从功能的角度来看,两种代码都提供了相同的结果。但是,最合适的方法是什么?

什么感觉都是最简单的。我相信将方法添加doNext到返回的类中getActivity()是最好的,这样您就可以编写以下内容是最清楚的。

getActivity().doNext();

我找不到合适的方法来评估性能

使用 CPU 和内存分析器,或为系统的不同组件编写性能测试。

应该执行评估哪些计数器(内存使用情况、函数速度、使用的 CPU 周期等)。

如果你不能使用分析器,我会从经过时间开始。即 System.nanoTime()。这通常是您所需要的。

于 2013-01-12T15:43:00.410 回答
3

声明/赋值不是 Java 中的对象创建。它只将引用放在堆栈上。第一个更清晰,可能更快(getActivity仅调用一次)。

于 2013-01-12T15:39:11.047 回答
1

取决于getActivity()做什么。2段代码的区别在于第二段调用了函数2次。函数调用本身是非常快的,但是函数正在做的事情可能并不快。

如果你不确定这个函数是什么,你可以使用第一个函数,尽管第二个函数更易读。

于 2013-01-12T15:40:16.747 回答
0

如果getActiviy不创建新对象,而是根据某些标准返回创建的对象并且不是计算密集型的,那么第二种方法更好。但是,如果每次调用getActivity时都创建新对象和/或getActivity计算密集型,那么第一种方法会更好。

于 2013-01-12T15:38:05.137 回答
0

如果每次调用 getActivity() 返回不同的对象,则第二个版本不正确,如果不正确,则第二个版本只是多余的。两者都不是喜欢第二个版本的理由,也没有任何其他理由喜欢它。正如 Pater Lawrey 所说,不要浪费时间去猜测你的性能问题出在哪里。措施。

于 2013-01-13T00:13:54.767 回答