for(int i = 0; i < arr.length; i++)
JavaScript では、次のような for ループを作成すると、毎回配列の長さを計算するためコストがかかることを私は知っています。この動作は、リストと配列の c# でもコストがかかりますか。それともコンパイル時に最適化されますか? また、Java などの他の言語についてはどうですか?これはどのように処理されますか?
6 に答える
C# ではコストがかかりません。一つには、「計算」がありません。インライン化のおかげで、長さのクエリは基本的に基本的な操作です。そして第二に、(開発者によると)コンパイラはこのアクセスパターンを認識し、実際には配列要素へのアクセスの(冗長な)境界チェックを最適化するためです。
ところで、最近の JavaScript 仮想マシンにも同様のことが当てはまると思います。
すべての .Net 配列には、配列の長さを含むフィールドがあるため、長さは使用時に計算されるのではなく、作成時に計算されます。
.Net 仮想マシンは、可能な限り境界チェックを排除するのに非常に優れています。これは、境界チェックがループの外に移動されるケースの 1 つです (ほとんどの状況では、そうでない場合は 2 命令のオーバーヘッドだけです)。
編集:
ほとんどすべての言語で、答えは「場合による」です。
ほとんどの場合、ループ中にリストまたは配列の長さが変化する可能性があるかどうかを判断できるほどコンパイラが賢いかどうかに依存します。
ただし、それが言語仕様で定義されている可能性は低いです。
したがって、コンパイルがそれを理解できない可能性があると想定するのはおそらく安全です。オブジェクトの長さが変わらないと本当に信じている場合は、最初に自由に長さを計算し、それをループ制御構造で使用してください。
ただし、他のスレッドには注意してください...
Linq Count()拡張メソッドを使用すると、呼び出されるたびに計算される可能性があると思います。
Java のようなものであれば、O(1) 操作である必要があります。
次のリンクが役に立ちました: http://www.devguru.com/Technologies/Ecmascript/Quickref/array.html
また、ゲッターが計算を行っているか、既知の値にアクセスしているかによっても異なります。