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

はい。可読性と保守性は、99.999% のケースでパフォーマンスよりもはるかに重要です。パフォーマンスのヒントには、「デフォルトで強化された for ループを使用する必要があります」と書かれています。

したがって、パフォーマンスの問題があり、foreach ループをカウント ループに変換することでこのパフォーマンスの問題が解決されるか、少なくとも状況が大幅に改善されることが証明されている場合を除き、読みやすさと保守性、したがって foreach ループを優先する必要があります

于 2013-08-24T09:04:57.940 に答える
2

コードのコンテキストを確認する必要があります。すべてのオブジェクト作成をループ外でチューニングしており、これが頻繁に使用されている場合は、インデックス付きループに切り替えると違いが生じる可能性があります。

あなたの場合、明らかに、ログ文字列を作成するはるかに高価な操作があります。これを最適化すると、はるかに大きな違いが生まれます。(おそらく 10 ~ 1000 倍以上)

于 2013-08-24T09:03:34.290 に答える
1

はい、イテレータによってパフォーマンスがわずかに低下します。この反復子を使用する通常の for ループでもこのような損失が発生しますが、手動で反復する方がわずかに高速です。ただし、これは非常に小さく (ここに示すようにナノ秒のオーダー)、無視できます。

オブジェクトの作成と破棄、および/またはその他のコストのかかる操作を制限するなど、他の場所で最適化を行う必要があります。

于 2013-08-24T09:04:37.430 に答える