-1

ここに私のプログラムコードの一部があります:

int test;
for(uint i = 0; i < 1700; i++) {
    test++;
}

プログラム全体0.5が完了するまでに数秒かかりますが、次のように変更すると:

int test[1];
for(uint i = 0; i < 1700; i++) {
    test[0]++;
}

数秒かかります3.5!を に変更するintdouble、さらに悪化します。

double test;
for(uint i = 0; i < 1700; i++) {
    test++;
}

完了するまでに約数秒かかります18!!!

実際のループでint配列要素とdouble変数を増やす必要があり、約数秒かかります!for30

ここで何が起こっているのですか?! インクリメントだけでなぜそんなに時間がかかるのでしょうか?! doubleのような浮動小数点データ型は、のような固定小数点データ型とは異なる構造を持っていることは知っていますintが、それがそのような大きな異なる時間の唯一の原因ですか? intそして、配列要素でもある2番目の例はどうですか?!

ありがとう

4

1 に答える 1

1

あなたはあなた自身の質問に答えました。

float (double) 演算は整数演算とは異なります。追加するだけでも1.0f

2 番目の例は、ポインター参照をいくつか追加したため、最初の例よりも時間がかかります。C の配列は、最初の要素へのポインターと大差ありません。最初の要素であっても、任意の要素にアクセスすると、マシンコードが配列の開始アドレスをロードし、インデックス (この場合は 0) に各メンバーの長さ (4 または int が持つバイト数) を乗算し、それを加算します (0 ) ポインターに。次に、ポインターを逆参照する必要があります。つまり、そのアドレスに値を実際にロードする必要があります。1 つ追加し、結果を書き戻します。

スマートな最新のコンパイラは、これを少し最適化する必要があります。この最適化を避けたい場合は、コードを少し変更し、インデックスに定数を使用しないでください。

最新の Objective-C コンパイラでそれを試したことはありません。しかし、このコードの実行には 3.5 秒よりもはるかに長い時間がかかると思います。

int test[2];
int index = 0;
for(uint i = 0; i < 1700; i++) {
    test[index]++;
}

それでもあまり変わらない場合は、次のことを試してください。

-(void)foo:(int)index {
  int test[2];
  for(uint i = 0; i < 1700; i++) {
      test[index]++;
  }
}

そして電話するfoo:0;

試してみて、私たちに知らせてください:)

于 2013-05-31T22:12:30.247 に答える