0

以下を考慮してください(特定の言語ではありません):

for (i=0; i<list.length(); i++) { ... }

一部の人々は、次のように書き直すことを好みます。

int len = list.length()
for (i=0; i<len; i++) { ... }

これは、ビアの長さの取得list.length()が O(1) 以外の場合に意味があります。しかし、これが事実である理由はわかりません。データ型に関係なく、長さフィールドをどこかに追加して、サイズが変更されるたびに更新するのは簡単です。

長さの取得または更新が O(1) ではない一般的なデータ型はありますか? それとも、誰かがそれをやりたいと思う別の理由がありますか?

4

2 に答える 2

0

これはマイクロ最適化ですが、有効なものです(実行する必要があることを意味するわけではありませんが、速度を向上させることができます - ほとんどの場合、目に見えない速度向上)。これが有効である理由は、エイリアシングによるものです。

lengthループ内で変更することができ、非侵入型コンパイラはそれが変更されているかどうかを判断できない可能性があります。したがって、ループの前に値に一度アクセスするのではなく、毎回値を読み取る必要があります。

C++ で行うように、メソッド呼び出しを介して長さが取得される場合、違いはさらに顕著になります。

int len = vect.size();
于 2012-10-12T23:40:31.077 に答える
0

この場合、ゲッター (関数呼び出し) を使用せずに、プロパティに直接アクセスしています。それはおそらく常にメソッド呼び出しよりも高速です。メソッド呼び出しがあったとしても、多くの言語はそれを最適化するほどスマートです。

于 2012-10-12T23:40:53.713 に答える