Pull to refresh

Comments 15

Не хуже, но если важна точность измерений, то нужно использовать performance.now()
Почитать про точность временных функций можно в этой статье
Статья требует апдейта из комментариев к оригиналу.
Во-первых, в последнем примере sort() без параметром сортирует числа как строки, что может привести к абсолютно неверному нахождению медианы.
Во-вторых, isIn2 быстрее, чем isIn1, а не наоборот. Почему ошибся автор? Он запускал код в CodePen, который в каждый цикл внедряет специальный код, не позволящий уйти в бесконечность. Так что мир не перевернулся, не пугайтесь: цикл for быстрее, чем forEach.
Так что лучший способ сделать свой код быстрее — подумать головой, измерить и подумать еще раз)
В моих собственных тестах (локально, без codepen) цикл forEach частенько оказывается быстрее. Не всегда, но частенько.
По примеру из статьи.

лиса и хром:
isIn1 took 0.0050
isIn2 took 0.0000

ИЕ:
isIn1 took 0.0088
isIn2 took 0.0040

нода (через process.hrtime())
isIn1 took 0.0060
isIn2 took 0.0026

Статья вводит в заблуждение.
image
Статья говорит:
лучший способ сделать свой код быстрее — измерить и сравнить

Так что, чтоб знать наверняка, нужно взять и сравнить, а не писать что статья неправильная и врет.
Так что, чтоб знать наверняка, нужно взять и сравнить

Именно это и было сделано. Не однократно и на разных конфигах.
Ваш скриншот вызывает недоумение и желание узнать в чем и на чем это было сделано.
Если запускалось в codepen то вам нужно прочитать комментарий arusakov
К слову это то что выполняет codepen
function isIn1(haystack, needle) {
    var found = false;
    haystack.forEach(function (element) {
        if (element.toLowerCase() === needle.toLowerCase()) {
            found = true;
        }
    });
    return found;
}
function isIn2(haystack, needle) {
    for (var i = 0, len = haystack.length; i < len; i++) {
        if (window.CP.shouldStopExecution(1)) {
            break;
        }
        if (haystack[i].toLowerCase() === needle.toLowerCase()) {
            return true;
        }
    }
    return false;
    window.CP.exitedLoop(1);
}
console.log(isIn1([
    'a',
    'b',
    'c'
], 'B'));
console.log(isIn1([
    'a',
    'b',
    'c'
], 'd'));
console.log(isIn2([
    'a',
    'b',
    'c'
], 'B'));
console.log(isIn2([
    'a',
    'b',
    'c'
], 'd'));
function median(sequence) {
    sequence.sort();
    return sequence[Math.ceil(sequence.length / 2)];
}
function measureFunction(f) {
    var letters = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'.split(',');
    var numbers = [];
    for (var i = 0; i < letters.length; i++) {
        if (window.CP.shouldStopExecution(2)) {
            break;
        }
        var t0 = performance.now();
        f(letters, letters[i]);
        var t1 = performance.now();
        numbers.push(t1 - t0);
    }
    window.CP.exitedLoop(2);
    console.log(f.name, 'took', median(numbers).toFixed(4));
}
measureFunction(isIn1);
measureFunction(isIn2);

я просто в хрому открыл ссылку из статьи 2 раза, в первый раз результаты были одинаковы, во второй сделал скрин.
В комментарии выше ясно видно как codepen изменил код. Как следствие все тесты в нем ложные.
Так статья врет. И самое ужасное то, что кто-то действительно прочитает ее, не будет читать комментарии здесь или к оригиналу и пойдет по своему коду изменять for на forEach с твердой уверенностью, что все делает правильно.
Разве Date не в юникс-таймстампе время держит, которое тоже от перевода на летнее время не меняется?
Date содержит инфо не в таймстампе, его можно выводить в таймстамп, но так как Date содержит в себе еще и смещение зоны, то оно может показывать не очевидный вариант
По мне так профилировщик (если он есть) куда больше подходит для анализа производительности и поиска узких мест.
А вот скажем для сбора статистики от конечных пользователей вполне себе интересный вариант.
Sign up to leave a comment.