ひろし
2007-06-13 02:08:00 UTC
最適化オプションを有効にした時、コンパイラは文脈から判断して、
毎回計算する必要が無いプロパティの計算を1度きりで済ませますか?
例えばサンプルAのようなforループがあります。
forループの最中temp1.Lengthが不変であることは文脈から明らかです。
コンパイラの最適化オプションが賢ければ、temp1.Lengthの計算を一回で済ませ、
以降はその値を基にループ終了の判定をしてくれるはずです。
コンパイラの最適化オプションが賢くなければ、毎回temp1.Lengthを計算します。
実際はどうなのでしょうか?
私は無駄な計算を避けるために、わざわざサンプルBのような記述をしています。
コンパイラが十分賢いことが分かれば、わざわざサンプルBのような書き方をする必要が無くなります。
// サンプルA
int[] temp1 = new int[1000];
// Lengthプロパティは毎回呼び出されるのか?
for(int i = 0;i < temp1.Length;i++)
{
temp1[i] = i;
}
// サンプルB
int[] temp1 = new int[1000];
//
int num = temp1.Length;
for(int i = 0;i < num;i++)
{
temp1[i] = i;
}
注意
Lengthプロパティによるオーバーヘッドは実際は微々たるものです。
上記サンプルは説明用に作成したもので実用的ではありません。
Lengthよりはるかに重たいプロパティの場合、毎回計算されることによる
オーバーヘッドが問題になります。
毎回計算する必要が無いプロパティの計算を1度きりで済ませますか?
例えばサンプルAのようなforループがあります。
forループの最中temp1.Lengthが不変であることは文脈から明らかです。
コンパイラの最適化オプションが賢ければ、temp1.Lengthの計算を一回で済ませ、
以降はその値を基にループ終了の判定をしてくれるはずです。
コンパイラの最適化オプションが賢くなければ、毎回temp1.Lengthを計算します。
実際はどうなのでしょうか?
私は無駄な計算を避けるために、わざわざサンプルBのような記述をしています。
コンパイラが十分賢いことが分かれば、わざわざサンプルBのような書き方をする必要が無くなります。
// サンプルA
int[] temp1 = new int[1000];
// Lengthプロパティは毎回呼び出されるのか?
for(int i = 0;i < temp1.Length;i++)
{
temp1[i] = i;
}
// サンプルB
int[] temp1 = new int[1000];
//
int num = temp1.Length;
for(int i = 0;i < num;i++)
{
temp1[i] = i;
}
注意
Lengthプロパティによるオーバーヘッドは実際は微々たるものです。
上記サンプルは説明用に作成したもので実用的ではありません。
Lengthよりはるかに重たいプロパティの場合、毎回計算されることによる
オーバーヘッドが問題になります。