【问题标题】:Performance-critical ArrayList iteration (ioshed example)性能关键的 ArrayList 迭代(ioshed 示例)
【发布时间】:2023-03-24 03:04:01
【问题描述】:

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

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

【问题讨论】:

    标签: java android performance arraylist


    【解决方案1】:

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

    所以,除非您遇到性能问题,并且您已经证明将 foreach 循环转换为计数循环可以解决此性能问题,或者至少显着提高在这种情况下,您应该优先考虑可读性和可维护性,以及 foreach 循环。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        是的,迭代器的性能损失很小。使用此迭代器的常规 for 循环也会遇到此类损失,而手动迭代会稍微快一些。然而,这非常小(在here 中看到的纳秒级),并且可以忽略

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

        【讨论】:

          猜你喜欢
          • 2012-10-08
          • 2018-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-23
          • 1970-01-01
          • 2013-05-19
          • 2015-01-18
          相关资源
          最近更新 更多