Javascript: LocalVsGlobal

12th April 2005 - 01:14

Недавно услышал, что доступ к локальным переменным в 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 не рекомендуют писать так:
<span style="text-decoration:line-through;">страш..</span> старшего.
Вместо этого они предлагают использовать теги 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:

Мне остаётся лишь согласиться. :)

Спасибо за комментарий.

Комментарии временно отключены.