2014-03-29 28 views
1

在某些情况下,我们使用一个循环为方便起见,也可以“手动”执行一些操作,例如从我的应用程序处理MenuItem S:增强的for循环VS处理对象手动

  1. 我创建了一个MenuItem s,然后使用增强的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); 
    

由于只有几个元素,性能目视相同的。

  • 但是哪个代码工作得更快,为什么?
  • 另外,在哪个时间点fileActionsToLock数组和临时MenuItemi将被垃圾收集?

回答

2

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

(2)什么时候垃圾收集很难说。通常,当没有更多引用指向它时,对象将有资格进行垃圾回收。实际发生的方式和时间取决于您的单个设备的JVM正在运行的其他代码和垃圾收集。不同版本的Android操作系统有不同类型的垃圾收集器。 Some more about garbage collectors可以在这里找到和also here

+2

由于不需要像增强for循环那样创建迭代器,因此手册的速度会更快。它并没有真正有所作为,特别是在这种情况下只有很少的项目。不过,使用for循环的+1。明显更容易和更好地扩展。 –

+0

循环展开是一种常见的优化,比将语句组合成循环容易。把它写成一个循环不仅更加清晰,而且还将JVM的展开决策留给了JVM,JVM拥有更多关于运行时环境的数据。 –

+0

具有JIT的JVM不会自行展开循环吗?迭代器将创建更多的开销,并在创建它时最初放慢整个过程,但我不知道实际代码将在循环的外侧执行得更快。 – Rarw

1

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

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

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

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

0

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