0

好吧,性能提示中指出:

因此,您应该默认使用增强的 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);
        }
    }

请注意有一个增强的 for 循环迭代通过scheduleUpdates,同时建议避免这种类型的迭代 for ArrayList

那是因为从性能的角度来看,应用程序的这一部分不被认为是关键的,还是我不理解某些东西?非常感谢。

4

3 回答 3

2

您需要查看代码的上下文。如果您已将所有对象创建调整到循环之外并且这被大量使用,那么切换到索引循环可能会有所作为。

在您的情况下,您显然有一个更昂贵的操作来创建日志字符串。优化这一点会产生很大的不同。(可能是 10 - 1000 倍以上)

于 2013-08-24T09:03:34.290 回答
2

是的。在 99.999% 的情况下,可读性和可维护性比性能重要得多。性能提示说:“您应该默认使用增强的 for 循环”。

因此,除非您遇到性能问题,并且您已经证明将 foreach 循环转换为计数循环可以解决此性能问题,或者至少显着改善了这种情况,否则您应该支持可读性和可维护性,从而支持 foreach 循环。

于 2013-08-24T09:04:57.940 回答
1

是的,迭代器会造成很小的性能损失。使用此迭代器的常规 for 循环也会遇到此类损失,而手动迭代会稍微快一些。然而,这是非常小的(在纳秒的数量级,如此处所示,并且可以忽略不计

应该在其他地方进行优化,例如限制对象的创建和销毁,和/或其他昂贵的操作。

于 2013-08-24T09:04:37.430 回答