嗯,Performance Tips中说明:
因此,您应该默认使用增强型for循环,但请考虑使用 针对性能关键型ArrayList的手写计数循环 迭代。
但是看ioshed 2013应用程序,这被认为是大多数开发人员的一个例子,特别是ScheduleUpdaterService.java
我可以看到以下内容:
void processPendingScheduleUpdates() {
try {
// Operate on a local copy of the schedule update list so as not to block
// the main thread adding to this list
List<Intent> scheduleUpdates = new ArrayList<Intent>();
synchronized (mScheduleUpdates) {
scheduleUpdates.addAll(mScheduleUpdates);
mScheduleUpdates.clear();
}
SyncHelper syncHelper = new SyncHelper(this);
for (Intent updateIntent : scheduleUpdates) {
String sessionId = updateIntent.getStringExtra(EXTRA_SESSION_ID);
boolean inSchedule = updateIntent.getBooleanExtra(EXTRA_IN_SCHEDULE, false);
LOGI(TAG, "addOrRemoveSessionFromSchedule:"
+ " sessionId=" + sessionId
+ " inSchedule=" + inSchedule);
syncHelper.addOrRemoveSessionFromSchedule(this, sessionId, inSchedule);
}
} catch (IOException e) {
// TODO: do something useful here, like revert the changes locally in the
// content provider to maintain client/server sync
LOGE(TAG, "Error processing schedule update", e);
}
}
请注意,通过scheduleUpdates
有一个增强的for循环迭代,同时建议避免ArrayList
的这种类型的迭代。
是否因为从性能角度来看,应用程序的这一部分并不重要,或者我不理解某些内容?非常感谢。
答案 0 :(得分:2)
您需要查看代码的上下文。如果你已经将所有对象创建调出循环并且这被大量使用,那么切换到索引循环会产生影响。
在您的情况下,您显然需要更昂贵的操作来创建日志字符串。优化这将使得更多,更多的差异。 (可能10到1000倍)
答案 1 :(得分:2)
是。在99.999%的案例中,可读性和可维护性比性能更重要。性能提示说:“你应该默认使用增强的for循环”。
所以,除非你有性能问题,并且已经证实将foreach循环转换为计数循环,否则会解决此性能问题,或者至少会显着改善在这种情况下,你应该倾向于可读性和可维护性,从而有利于foreach循环。
答案 2 :(得分:1)
是的,迭代器的性能损失很小。使用此迭代器的常规for循环也会遇到这样的损失,而手动迭代会稍快一些。然而,这非常小(如here所示,大约为纳秒级),可忽略不计。
应在其他地方进行优化,例如限制对象创建和销毁,和/或其他昂贵的操作。