@hadaev_ivan

Что быстрее bind(context), closure или bind(null, arg1, arg2) и почему?

Не так чтобы это жизненно важный вопрос, скорее больше из любопытства. Есть некоторая функция, которая выполняется очень много раз в секунду как синхронно(for) так и асинхронно(requestAnimationFrame), внутри нее как-то обрабатываются некоторые данные. Собственно вопрос, что будет быстрее подмена this через bind и передача данных через this, обычное замыкание или bind(null, ...данные).
Я пробовал писать примитивный тест для этого, в хроме побеждают замыкания(что для меня странно). Первый пробег выполняется медленно и с замыканиями и с bind, но дальнейшие итерации замыкания немного выигрывают. Хотя я всегда думал что замыкания должны быть дороже в многоразовой перспективе. Есть те кто "в теме" и понимает почему так и как сделать лучший выбор при написании подобных функций(допустим скорость критична и производительность важнее читаемости..)?

Мой тест:
const context = {sum: 0};
const closured = function () {
    context.sum += 1;
};

const binded = function () {
    this.sum += 1;
}.bind(context);

const bindNull = function (context) {
    context.sum += 1;
}.bind(null, context);

for(let j = 0; j < 4; j++){
    console.time('closure');
    for (let i = 0; i < 10000; i++) {
        closured();
    }
    console.timeEnd('closure');

    console.time('bind');
    for (let i = 0; i < 10000; i++) {
        binded();
    }
    console.timeEnd('bind');

    console.time('bindNull');
    for (let i = 0; i < 10000; i++) {
        bindNull();
    }
    console.timeEnd('bindNull');
}


Результат:
closure: 0.187ms
bind: 0.181ms
bindNull: 0.177ms
closure: 0.066ms
bind: 0.078ms
bindNull: 0.099ms
closure: 0.062ms
bind: 0.077ms
bindNull: 0.110ms
closure: 0.017ms
bind: 0.057ms
bindNull: 0.079ms
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Функция возвращаемая .bind выполняет много проверок и преобразований внутри
https://github.com/v8/v8/blob/master/src/builtins/...
Поэтому простейшее замыкание, особенно сохраненное заранее, а значит уже скомпилированное и оптимизированное при многократных вызовах, будет выполняться быстрее, ибо всех этих проверок не делает
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dpigo
@dpigo
Front-end developer
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы