繁体   English   中英

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

[英]Enhanced for-loop vs handling objects manually

在某些情况下,我们使用循环以方便,但也可以“手动”执行一些操作,例如从我的应用程序处理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); 

由于只有少数元素,因此性能在视觉上是相同的。

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

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

(2)当垃圾收集的东西很难说。 通常,当没有更多引用指向它时,对象将有资格进行垃圾回收。 实际发生的方式和时间取决于您的单个设备的JVM正在运行的其余代码和垃圾回收。 不同版本的android os有不同种类的垃圾收集器。 一些更多的垃圾收集器可以在这里,发现这里也

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM