Оптимизация JavaScript: как более эффективно кэшировать начальные значения локальных переменных?

Мне просто интересно. Может быть, кто-то знает, что движки JavaScript могут оптимизировать в 2013 году, а что нет? Есть предположения на ближайшее будущее? Искал хорошие статьи, но "библии" в инете пока нет.

Хорошо, давайте сосредоточимся на одном вопросе:

Предположим, у меня есть функция, которая вызывается каждые 10 мс или в узком цикле:

function bottleneck () {

    var str = 'Some string',
        arr = [1,2,3,4],
        job = function () {
            // do something;
        };

    // Do something; 
    // console.log(Date.getTime());
}

Как видите, мне не нужно каждый раз вычислять начальные значения переменных. Но если я перенесу их в верхнюю область, я потеряю поиск переменных. Итак, есть ли способ заставить движок Javasript сделать такую ​​очевидную вещь - предварительно вычислить начальные значения переменных?

Я создал jsperf, чтобы очистить свой вопрос. Я экспериментирую с разными типами. Меня особенно интересуют функции и примитивы.


person Dan    schedule 24.07.2013    source источник


Ответы (2)


если вам нужно вызывать функцию каждые 10 мс, а это узкое место, первая мысль, которая у вас должна возникнуть, будет: «Я не должен вызывать эту функцию каждые 10 мс». Что-то пошло не так в вашей архитектуре. При этом см. 1b в http://jsperf.com/variables-caching/2, который примерно в четыре раза быстрее, чем ваша "кэшированная" версия - основная причина в том, что для каждой переменной в вашем коде вы либо перемещаете область действия, либо переобъявляете. В 1b мы поднимаемся вверх по области действия один раз, чтобы получить «инициалы», затем устанавливаем локальные псевдонимы для его содержимого из локальной ссылки. Экономится много времени.

person Mike 'Pomax' Kamermans    schedule 24.07.2013

(Касается V8)

Ну, сами данные массива не создаются, но каждый раз необходимо создавать уникальный объект массива. Резервный массив для значений 1,2,3,4 является общим для этих объектов.

Строка интернирована, и на самом деле быстрее всего скопировать и вставить одну и ту же строку везде как литерал вместо ссылки на какую-то общую переменную. Но для обслуживания вы действительно не хотите этого делать.

Не создавайте никаких новых функций внутри горячей функции, если ваша функция job ссылается на какие-либо переменные из функции bottleneck, тогда, прежде всего, эти переменные станут выделенными контекстом и будут медленными для доступа в любом месте, даже во внешней функции, и это предотвратит встраивание функции узкого места на данный момент. Встраивание — это важная оптимизация, которую вы не хотите пропустить, когда это возможно.

person Esailija    schedule 01.08.2013