1

この場合、何がベストプラクティスと見なされますか?

for (i=0; i<array.length(); ++i)

また

for (i=array.length()-1; i>=0; --i)

特定の方向から反復するのではなく、配列の裸の長さにわたって反復したくないと仮定します。また、ループ本体で配列のサイズを変更する予定はありません。

それで、array.length()コンパイル中に定数になりますか?そうでない場合は、2番目のアプローチを選択する必要があります..

4

7 に答える 7

1

バージョン 2 は壊れており、配列の 1 つ前の末尾から 1 まで反復します。(現在修正済み)

バージョン 1 に固執します。これはよく認識されており、読者が二度手間になることはありません。

于 2010-05-25T23:17:43.073 に答える
1

最初の方法の方がはるかに読みやすいので、最初の方法を実行します。ループを繰り返していることがわかります。2番目のものは私に1秒かかりました:(。

array.length配列を変更しない限り、一定のままです。

于 2010-05-25T23:17:55.513 に答える
1

バージョン 1 は、はるかに広く使用されており、理解しやすいものです。バージョン 2 は、コンパイラが array.length() を定数に最適化しない場合、わずかに高速になることがありますが、...insert your own premature optimization comment here

編集: array.length() が最適化されるかどうかについては、言語によって異なります。言語が「通常の」オブジェクトとして配列を使用するか、配列を動的にサイズ変更できる場合、それは単なるメソッド呼び出しであり、コンパイラは一貫した戻り値を返すとは想定できません。しかし、配列が特殊なケースまたはオブジェクトである言語 (またはコンパイラが本当に賢い...) の場合、速度の違いはおそらく解消されます。

于 2010-05-25T23:22:28.173 に答える
1

ほとんどの場合、O(1) であるような方法で実装されると予想array.length()されるため、ループのパフォーマンスには実際には影響しません。疑問がある場合、または定数であることを確認したい場合は、明示的に行ってください。

// JavaScript
var l = a.length;

for (var i=0; i<l; i++) {
  // do something
}

逆表記は「巧妙なハック」であり、時期尚早な最適化のカテゴリに分類されます。読みにくく、エラーが発生しやすく、私が提案する代替手段よりも実際には利点がありません。

しかし、コンパイラー/インタープリターの実装は大きく異なり、どの言語を参照しているのかを述べていないため、これについて絶対的な声明を出すことは困難です. これがコードの絶対的にタイム クリティカルなセクションであるか、コードの実行時間に測定可能な程度に寄与している場合を除き、別の方法で実行することで実際のメリットが得られることがベンチマーク テストで示されている場合を除き、理解しやすく保守しやすいコードに固執します。 .

于 2010-05-25T23:22:54.520 に答える
0

for (i=0; i<array.length(); ++i)私にとってはより良いですが、for (i=array.length()-1; i>=0; --i)最速です。なぜなら、一般的なプロセッサは、0 と比較して条件を 2 つの変数と比較する条件を最速でチェックするからです。

array.lenght()繰り返しの下でこの配列から要素を追加/削除しない場合、定数です。

于 2010-05-25T23:16:49.283 に答える
0

私自身のコードの for ループについては、おそらくやり過ぎかもしれませんが、ループの長さが 1 回だけ計算されるようにループを記述するという習慣を早い段階で身に付けましたが、ループは自然な方法で進行します。

int len = array.length();
for (int i=0; i<len; ++i) {
    doSomething(array[i]);
}

しかし最近では、利用可能で便利な "for-each" 機能を使用することを好みます。それらはループを読みやすく、誰にでもできるようにします。C++ では、次のようになります。

std::for_each(array.begin(), array.end(), &doSomething);
于 2010-05-25T23:30:08.603 に答える
0

バージョン 1 が最も高速です。for (i=0; i

于 2010-05-25T23:37:59.653 に答える