Если что-то.awesome является полем , то, вероятно, будет доступ каждый раз вокруг цикла, поскольку что-то в теле цикла может его обновить.Если тело цикла достаточно простое и не вызывает никаких методов (кроме методов, встроенных компилятором), то компилятор может доказать, что безопасно помещать значение чего-то.Авторы компиляторов обычно делали все возможное, чтобы справиться с этой задачей.
Однако в наши дни для доступа к значению из основной памяти требуется очень много времени, но после того, как значение было прочитано для первоговремя, это тренируется процессором.Повторное считывание значения из кэша ЦП по скорости намного ближе к чтению из регистра, а затем к чтению из основной памяти. Нередко кэш-память ЦП может быть в сотни раз быстрее основной памяти.
Теперь, если что-то. Awesome является свойством , то оно действуетвызов метода.Компилятор будет вызывать метод каждый раз вокруг цикла.Однако, если свойство / метод состоит всего из нескольких строк кода, он может быть встроен компилятором.Встраивание - это когда компилятор вставляет копию кода метода напрямую, а не вызывает метод, поэтому свойство, которое просто возвращает значение поля, будет вести себя так же, как в примере с полем выше.
Эван, когдасвойство не встроено, оно будет находиться в кэше ЦП после первого вызова.Таким образом, эль очень сложна, или цикл повторяется много раз, и первый вызов вокруг цикла занимает намного больше времени, возможно, более чем в 10 раз.
дни , раньше было легко, потому что все действия по доступу к памяти и процессорам выполнялись примерно в одно и то же время.В наши дни кэш процессора может легко изменить время некоторых обращений к памяти и вызовов методов на с коэффициентом 100 .Профилировщики все еще предполагают, что все обращения к памяти занимают одно и то же время!Поэтому, если вы запишете в профиль, вам будет предложено внести изменения, которые могут не иметь никакого эффекта в реальном мире.
Изменение кода на:
int limit = something.awesome;
for(int i = 0; i < limit; i++)
{
// Do cool stuff
}
В некоторых случаях оно будет распространяться,но и делает его более сложным.Однако
int limit = myArray.length;
for(int i = 0; i < limit; i++)
{
myArray[i[ = xyn;
}
медленнее, чем
for(int i = 0; i < myArray.length; i++)
{
myArray[i[ = xyn;
}
, поскольку .net проверяет границы массивов каждый раз, когда к ним обращаются, и имеет логику для удаления проверки, когда цикл достаточно прост.
Поэтому лучше сохранять код простым и понятным, пока вы не докажете, что есть проблема.Вы получаете гораздо больше прибыли, тратя свое время на улучшение общего дизайна системы, это легко сделать, если код, с которого вы начинаете, прост.