有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

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

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

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

提前感谢您的贡献


共 (5) 个答案

  1. # 1 楼答案

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

    Knowing that objects creation/destruction is one of the factors

    创建一些对象并不重要。创建太多的对象。多少是太多,哪些对象创建得最多,这是您应该使用探查器来确定的

    From a functional perspective, both codes are delivering the same results. However, what is the most suitable approach?

    你的感觉是最简单的。我认为将方法doNext添加到getActivity()返回的类中是最好的,这样您就可以编写以下内容了

    getActivity().doNext();
    

    I’m unable to find the appropriate way to evaluate the performance

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

    which counters (memory usage, function' speed, used CPU cycles, etc) the evaluation should be performed.

    如果你不能使用分析器,我会从简单的时间流逝开始。i、 e.系统。nanoTime()。这通常就是你所需要的

  2. # 2 楼答案

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

  3. # 3 楼答案

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

  4. # 4 楼答案

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

  5. # 5 楼答案

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

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