性能关键的ArrayList迭代(ioshed示例)

时间:2013-08-24 09:00:11

标签: java android performance arraylist

嗯,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的这种类型的迭代。

是否因为从性能角度来看,应用程序的这一部分并不重要,或者我不理解某些内容?非常感谢。

3 个答案:

答案 0 :(得分:2)

您需要查看代码的上下文。如果你已经将所有对象创建调出循环并且这被大量使用,那么切换到索引循环会产生影响。

在您的情况下,您显然需要更昂贵的操作来创建日志字符串。优化这将使得更多,更多的差异。 (可能10到1000倍)

答案 1 :(得分:2)

是。在99.999%的案例中,可读性和可维护性比性能更重要。性能提示说:“你应该默认使用增强的for循环”。

所以,除非你性能问题,并且已经证实将foreach循环转换为计数循环,否则会解决此性能问题,或者至少会显着改善在这种情况下,你应该倾向于可读性和可维护性,从而有利于foreach循环。

答案 2 :(得分:1)

是的,迭代器的性能损失很小。使用此迭代器的常规for循环也会遇到这样的损失,而手动迭代会稍快一些。然而,这非常小(如here所示,大约为纳秒级),可忽略不计

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