使用哪种语法来提高性能和资源利用率

时间:2013-01-12 15:32:53

标签: java android performance coding-style

在阅读了几篇关于如何微调我的代码的文章后,我发现我们声明对象和变量的方式可能会极大地影响我们的应用程序的性能。这一点越来越重要,因为时间限制现在是Android平台某些方面不可或缺的一部分(例如,某些操作必须在5秒内提供结果)。

现在,我在我的一个片段类中找到了以下代码(功能完备):

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

知道对象创建/销毁和资源分配是导致设备电池耗尽的一些因素,我想到了将代码重写为:

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

从功能角度来看,两个代码都提供相同的结果。但是,最合适的方法是什么?我问,因为我看到两种方法的优点和缺点,我无法找到评估性能的适当方法,我也不清楚哪些计数器(内存使用,功能速度,使用的CPU周期等) )应该进行评估。

感谢你提前做出的贡献。

5 个答案:

答案 0 :(得分:4)

猜测可能是性能瓶颈是一种非常常见的浪费时间。你必须衡量对你的整个计划有什么影响而不是猜测。

  

了解对象创建/销毁是其中一个因素

创建一些对象并不重要。创建太多对象问题。多少是太多,哪些对象最常创建是你应该使用分析器来确定的。

  

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

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

getActivity().doNext();
  

我无法找到评估效果的合适方法

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

  

应该执行评估(内存使用,功能'速度,使用的CPU周期等)。

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

取决于getActivity()做什么。 2段代码的区别在于第二段代码调用函数2次。函数调用本身非常快,但函数正在执行的操作可能不会很快。

如果你不确定这个功能是什么,你可以使用第一个,虽然第二个更具可读性。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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