Javascript: LocalVsGlobal
Недавно услышал, что доступ к локальным переменным в JavaScript осуществляется быстрее, чем к глобальным. Проверил это утверждение следующим куском кода:
function varsSpeed() {
document.writeln("<pre>Global\t\tLocal");
for (var i=0; i<10; i++)
{
xGlobal = 0;
var xLocal=0, t0, t1, j;
t0 = new Date().getTime();
for (j=0; ++j < 100000;) xGlobal++;
t1 = new Date().getTime();
document.write((t1-t0)/1000 + "\t\t");
t0 = new Date().getTime();
for (j=0; ++j < 100000;) xLocal++;
t1 = new Date().getTime();
document.writeln((t1-t0)/1000);
}
document.writeln("</pre>");
}
window.onload = varsSpeed;
Подтвердилось. Вот только ответа на вопрос «Почему?» так и не нашёл. На ум приходит только одна логика работы интерпретатора: при определении области видимости переменной второй путь более продолжителен
- Локальная? Да.
- Локальная? Нет. Глобальная? Да.
Однако, я не знаю как всё происходит на самом деле.
Ещё наблюдения.
Если интересно посмотреть с точки зрения «у какого браузера длиннее?», то мои подопытные показали такой результат (в порядке уменьшения времени работы):
- Global: Opera > Mozilla > IE.
- Local: Opera > IE > Mozilla.
Результаты в цифрах я не привожу специально; кому интересно, тот посмотрит на своей машине.
Следует отметить, что разные версии IE и Mozilla работали достаточно стабильно (IE5.0 и IE5.5 чуть-чуть быстрее своего страш.. старшего брата, но, во-первых, делать какие-либо серьёзные выводы из этого теста вряд ли стоит, во-вторых, всё может зависеть и от multiple Explorers, в-третьих, существуют тесты, утверждающие, что скрипты в пятой версии работают быстрее, так что я не удивлён). Opera 7.8b3 почти в два раза быстрее своих предшественниц (7.21 и 7.54), но всё равно немного отстаёт от IE/Moz.
PS. И ещё… При достижении определённой продолжительности работы скрипта (увеличении числа итераций цикла) IE и Mozilla услужливо спрашивают «А не прекратить ли нам это безобразие?». Opera молчит. Можно самостоятельно решить вопрос через F12, но… молчит.
Categories: dHtml | comments: (3)
Комментарии
1. Mix 13th April 2005 - 19:26
Я конечно придераюсь, но всётаки.
W3C не рекомендуют писать так:
.
Вместо этого они предлагают использовать теги ins и del:
<del>страш..</del> <ins>старшего</ins>
PS Спасибо за линк на Шиномонтаж, весьма занимательная игрушка.
Mash:
Замечание верное и придирки правильные, но… для того, чтобы мне удобно пользоваться <ins>, <del> (да и <q>, кстати, тоже), мне нужно немного покопаться в коде движка, а так как покопать помимо этого там ещё много чего стоит, то в своё время этот вопрос оставил на потом. Вот только когда это «потом» наступит — неизвестно.
PS. На эту заразу kukutz подсадил. :)
2. Mix 14th April 2005 - 16:55
А у тебя тама наверное WYSIWYG редактор?
Mash:
Только хилый закос под него. В основном всё руками, так проще. По большому счёту, дело не в нём и поправить нужно всего ничего, но если я полезу в движок, то лишь одной правкой не удовлетворюсь и начну переписывать другие места. А их много. :)
3. Владимир Палант 12th September 2005 - 19:26
Думаю, что причина в одной особенности JavaScript: глобальные переменные не являются, собственно, переменными — они свойства объекта window. А доступ к объекту window не из быстрых: там и поддержка Object.watch() (window наследует от Object только в Mozilla), да и всевозможные обработчики DOM тоже там висят. Опять же, конкретно для Mozilla точно знаю, что реализация произвольных свойств для DOM-объектов плохо оптимизирована, её давно хотят переделать.
Mash:
Мне остаётся лишь согласиться. :)
Спасибо за комментарий.