string.Length в проверке цикла или оптимизация
Код:
for (int i = 0; i < str.Length; i++)
{
Console.WriteLine("{0}: {1}", i, str);
}
{
Console.WriteLine("{0}: {1}", i, str);
}
Это же не оптимально! Получается, что после каждой итерации приложение будет повторно каждый раз вычислять размер строки и только потом будет проверяться условие. А что, если в приложении таких циклов несколько сотен, и каждый выполняется по несколько тысяч раз за одну сессию? Разве не оптимальнее будет использовать следующий код:
Код:
int strLength = str.Length;
for (int i = 0; i < strLength; i++)
{
Console.WriteLine("{0}: {1}", i, str);
}
for (int i = 0; i < strLength; i++)
{
Console.WriteLine("{0}: {1}", i, str);
}
Но почему-то в книге этот момент вообще не обговаривается... Может я чего не понимаю в оптимизациях современных языков? и компилятор при компилировании кода, что в первом примере, скомпилирует приложение так, что длина строки не будет высляться каждый раз, несмотря на str.Length в каждой итерации цикла? Проясните пожалуйста новичка)
str.GetLength() вычислялся бы, а str.Length - такая же переменная
Исключение проверки диапазона (Range check elimination).
Очень многие оптимизации берёт на себя JIT.
Ознакомьтесь с этим:
Очень многие оптимизации берёт на себя JIT.
Цитата: koodeer
Ознакомьтесь с этим: Исключение проверки диапазона (Range check elimination).
Прикольно. Получается, что str.Length можно использовать в циклах без боязни. Спасибо за прояснение)