Прежде всего, как это труднее сделать или менее разборчиво?
var i = someArray.length;
while(i--){
//doStuff to someArray[i]
}
Это не какая-то странная загадочная микрооптимизация. Это просто основной принцип уклонения от работы. Не используя «.» или операторы «[]», более чем необходимые, должны быть такими же очевидными, как не пересчитывать число «Пи» более одного раза (при условии, что вы не знали, что у нас это уже есть в объекте Math).
[вычурные элементы]
Если someArray является полностью внутренним для функции, это справедливая игра для JIT-оптимизации ее свойства length, которое действительно похоже на метод получения, который фактически подсчитывает элементы массива каждый раз, когда вы обращаетесь к нему. JIT мог видеть, что он был полностью локально ограничен, и пропустить фактическое поведение при подсчете.
Но это требует изрядного количества сложности. Каждый раз, когда вы делаете что-либо, изменяющее массив, вы должны обрабатывать длину как статическое свойство и указывать вашим методам изменения массива (я имею в виду ту часть кода, которую я имею в виду) установить свойство вручную, тогда как обычно длина просто подсчитывает элементы каждый раз, когда это происходит. ссылки. Это означает, что каждый раз, когда добавляется новый метод изменения массива, вы должны обновлять JIT для поведения ветвления для ссылок длины массива с локальной областью действия.
Я мог видеть, что Chrome делает это в конце концов, но я не думаю, что он пока основан на действительно неофициальных тестах. Я не уверен, что IE когда-либо будет иметь такой уровень тонкой настройки производительности в качестве приоритета. Что касается других браузеров, вы могли бы привести веские аргументы в пользу проблемы обслуживания, заключающейся в том, что поведение каждого нового метода массива должно вызывать больше проблем, чем его ценность. По крайней мере, это не получит высшего приоритета.
В конечном счете, доступ к свойству длины в каждом цикле цикла не будет стоить вам тонны даже в старых браузерах для типичного цикла JS. Но я бы посоветовал привыкнуть к кэшированию любого поиска свойств, который выполняется несколько раз, потому что со свойствами getter вы никогда не сможете быть уверены в том, сколько работы выполняется, какие браузеры оптимизируют, каким образом или какие потери производительности вы можете снизить путь, когда кто-то решит переместить someArray за пределы функции, что может привести к проверке объекта вызова в дюжине мест перед тем, как искать то, что он ищет, каждый раз, когда вы обращаетесь к этому свойству.
Кэширование поиска свойств и возврата методов выполняется легко, очищает ваш код и в конечном итоге делает его более гибким и надежным в плане производительности перед лицом изменений. Даже если один или два JIT сделали это ненужным в обстоятельствах, включающих несколько «если», вы не могли быть уверены, что они всегда будут, или что ваш код будет продолжать делать это возможным.
Так что да, извиняюсь за рассылку о запрете использования компилятора-дескриптора, но я не понимаю, почему вы захотите не кэшировать свои свойства. Это просто. Чисто. Это гарантирует лучшую производительность независимо от браузера или перемещения объекта, свойства которого проверены во внешней области.
Но меня действительно бесит, что документы Word теперь загружаются так же медленно, как они это делали в 1995 году, и что люди продолжают писать ужасно медленно работающие веб-сайты на Java, хотя виртуальная машина Java якобы превосходит всех не скомпилированных претендентов по производительности. Я думаю, что это представление о том, что вы можете позволить компилятору разобраться в деталях производительности, и что «современные компьютеры настолько быстры», во многом связано с этим. Мы всегда должны помнить об уклонении от работы, когда работы легко избежать и не угрожает удобочитаемости / ремонтопригодности, ИМО. Работа по-другому никогда не помогла мне (или я подозреваю кого-либо) написать код быстрее в долгосрочной перспективе.