手动增强for-loop与处理对象

时间:2014-03-29 15:21:26

标签: java android performance foreach

在某些情况下,我们使用循环以方便,但也可以“手动”执行某些操作,例如从我的应用程序处理MenuItem

  1. 我创建了一个MenuItem的小数组,然后使用增强的for循环遍历它。

    MenuItem[] fileActionsToLock ={ mMenu.findItem(R.id.action_share),
                                    mMenu.findItem(R.id.action_rename),
                                    mMenu.findItem(R.id.action_copy),
                                    mMenu.findItem(R.id.action_move) };
    for (MenuItem i : fileActionsToLock) {
        i.setEnabled(false);
        i.getIcon().setAlpha(100);
    }
    
  2. 我将值分别应用于每个MenuItem

    mMenu.findItem(R.id.action_share).setEnabled(false);
    mMenu.findItem(R.id.action_share).getIcon().setAlpha(100);
    mMenu.findItem(R.id.action_rename).setEnabled(false);
    mMenu.findItem(R.id.action_rename).getIcon().setAlpha(100);
    mMenu.findItem(R.id.action_copy).setEnabled(false);
    mMenu.findItem(R.id.action_copy).getIcon().setAlpha(100);
    mMenu.findItem(R.id.action_move).setEnabled(false);
    mMenu.findItem(R.id.action_move).getIcon().setAlpha(100);
    
  3. 由于只有少数元素,因此性能在视觉上是相同的。

    • 但哪个代码工作得更快,为什么?
    • 此外,fileActionsToLock数组和临时MenuItem i将在哪个时间进行垃圾回收?

3 个答案:

答案 0 :(得分:2)

(1)我不认为任何一个人的跑动速度明显快于另一个。循环将有更多的开销(例如,请参阅下面关于需要迭代器的注释)但是应该花费大约相同的时间来完成,就好像你只是单独写出所有步骤一样。底线 - 你不会注意到差异。我使用循环因为它可能使您的代码更容易阅读。

(2)当垃圾收集的东西很难说。通常,当没有更多引用指向它时,对象将有资格进行垃圾回收。实际发生的方式和时间取决于您的个人设备的JVM正在运行的其余代码和垃圾回收。不同版本的android os有不同种类的垃圾收集器。可在此处找到Some more about garbage collectorsalso here

答案 1 :(得分:1)

非循环方法肯定更快。比较标准for循环更容易,因为我们确切地知道发生了什么,因此我将以此为例。当循环开始时,我们声明变量检查条件是否满足,然后运行第一个代码块。在运行第一个代码块之后,我们在检查条件然后重复之前运行一个语句。

所有这些额外内容(声明一个额外的变量,检查条件并运行最终语句)都不会出现在第二个示例中。少发生,所以它总是会更快。也就是说,这些额外的操作对于现代计算机来说花费的时间或精力很少,实在不值得担心。差异可以忽略不计。如此之小,以至于它们不太可能对您的应用产生任何影响。即使foreach循环比for循环快,仍然会执行不在您的手动示例中的操作。

当决定何时使用一个或另一个时,您应该使用的标准是可读性,功能性,可扩展性等。读取循环更容易,并且代码更少。循环可用于动态检查条件,使其更具功能性。最后,循环更具可扩展性。您可以稍后在循环数组中添加更多Object,而无需更改代码。

至于垃圾收集,应该没有任何区别。在任何可访问和运行的代码中都没有对它们的引用时,它们都有资格进行收集。

答案 2 :(得分:0)

您可以阅读in this article。手动方式通常比循环增强更快,因为它不会调用迭代器上的任何方法。它也比正常循环更快,因为它不包含跳转和递增指令 - 但这不是一个真正的问题,因为没有人会对元素的几何元素进行手动操作以从CPU获得几毫秒。