26

for(int i = 0; i < arr.length; i++)JavaScript では、次のような for ループを作成すると、毎回配列の長さを計算するためコストがかかることを私は知っています。この動作は、リストと配列の c# でもコストがかかりますか。それともコンパイル時に最適化されますか? また、Java などの他の言語についてはどうですか?これはどのように処理されますか?

4

6 に答える 6

37

C# ではコストがかかりません。一つには、「計算」がありません。インライン化のおかげで、長さのクエリは基本的に基本的な操作です。そして第二に、(開発者によると)コンパイラはこのアクセスパターンを認識し、実際には配列要素へのアクセスの(冗長な)境界チェックを最適化するためです。

ところで、最近の JavaScript 仮想マシンにも同様のことが当てはまると思います。

于 2008-11-04T18:56:58.057 に答える
10
  1. すべての .Net 配列には、配列の長さを含むフィールドがあるため、長さは使用時に計算されるのではなく、作成時に計算されます。

  2. .Net 仮想マシンは、可能な限り境界チェックを排除するのに非常に優れています。これは、境界チェックがループの外に移動されるケースの 1 つです (ほとんどの状況では、そうでない場合は 2 命令のオーバーヘッドだけです)。

編集:

配列境界チェックの削除

于 2008-11-04T18:59:51.920 に答える
4

ほとんどすべての言語で、答えは「場合による」です。

ほとんどの場合、ループ中にリストまたは配列の長さが変化する可能性があるかどうかを判断できるほどコンパイラが賢いかどうかに依存します。

ただし、それが言語仕様で定義されている可能性は低いです。

したがって、コンパイルがそれを理解できない可能性があると想定するのはおそらく安全です。オブジェクトの長さが変わらないと本当に信じている場合は、最初に自由に長さを計算し、それをループ制御構造で使用してください。

ただし、他のスレッドには注意してください...

于 2008-11-04T18:57:11.177 に答える
1

Linq Count()拡張メソッドを使用すると、呼び出されるたびに計算される可能性があると思います。

于 2008-11-04T19:05:25.683 に答える
0

Java のようなものであれば、O(1) 操作である必要があります。

次のリンクが役に立ちました: http://www.devguru.com/Technologies/Ecmascript/Quickref/array.html

于 2008-11-04T18:58:46.540 に答える
0

また、ゲッターが計算を行っているか、既知の値にアクセスしているかによっても異なります。

于 2008-11-04T18:59:23.230 に答える