2

ループ内の非常に大きな配列の要素を設定する必要があります。場合によってはループが発生する可能性continueがあるため、配列の位置は個別にカウントする必要があります。

常に 10 個の連続する要素を設定する必要があります。(10 は例です。シナリオによっては、30 以上が必要になる場合があります。)

k+c(c=0,1,2,... 定数) またはk++より良いアプローチですか? 以下の 2 つのソリューションのうち、どちらがより効率的ですか? また、その理由は何ですか?

int k = 0;
for (int i = 0; i < aVeryHighNumber; i++) {                 
    if (continueRequired()) {
        continue;
    }

    k = ... // get k as a result of a certain calculation

    veryLargeArray[k++] = value0; // these values might be calculated on-the-fly
    veryLargeArray[k++] = value1;
    veryLargeArray[k++] = value2;
    veryLargeArray[k++] = value5;
    veryLargeArray[k++] = value4;
    veryLargeArray[k++] = value5;
    veryLargeArray[k++] = value6;
    veryLargeArray[k++] = value4;
    veryLargeArray[k++] = value7;
    veryLargeArray[k++] = value1;                   
}

2番目の解決策:

for (int i = 0; i < aVeryHighNumber; i++) {                 
    if (continueRequired()) {
        continue;
    }

    k = ... // get k as a result of a certain calculation

    veryLargeArray[k]      = value0;
    veryLargeArray[k + 1]  = value1;
    veryLargeArray[k + 2]  = value2;
    veryLargeArray[k + 3]  = value5;
    veryLargeArray[k + 4]  = value4;
    veryLargeArray[k + 5]  = value5;
    veryLargeArray[k + 6]  = value6;
    veryLargeArray[k + 7]  = value4;
    veryLargeArray[k + 8]  = value7;
    veryLargeArray[k + 9]  = value1;
}

理論的には、2 番目のソリューションは 9 回の加算操作 (基本的に展開されたループ) を実行しますが、最初のソリューションは 9 回のインクリメントを実行します。つまり、値も格納する必要がありkます。ただし、1 ずつ自己インクリメントすることは、最近ではおそらく非常に効率的な操作であるため、2 番目のソリューションが高速かどうかはわかりません。

4

2 に答える 2

9

違いを生む可能性は低いです。心配すべきもっと重要なことを見つけてください。

(余分な割り当てによる違いは、JIT によって最適化されます。パフォーマンスの違いは、単に小さいだけでなく、存在しない可能性が高いです。)

于 2012-12-13T17:23:16.540 に答える
4

コンパイルされたコードが表現されている限り、それは単にバイナリの追加です。コードは++単に. +1これらがコンパイル後にバイナリ加算に変換される場合、2 つの間に違いはありません。

たまたま違いがあったとしても、これを何千回も行うまで、最新のコンピューターでは計算時間に違いは見られません。

于 2012-12-13T17:26:45.017 に答える