Какой тестовый сайт JS правильный?

Я создал эталонный тест как на jsperf.com, так и на jsben.ch, однако они дают существенно разные результаты.

JSPerf: https://jsperf.com/join-vs-template-venryx
JSBench: http://jsben.ch/9DaxR

Обратите внимание, что кодовые блоки точно такие же.

На jsperf блок 1 "на 61% медленнее" самого быстрого:

На jsbench блок 1 всего на 32% медленнее, чем самый быстрый: ((99 - 75)/75)

Что дает? Я ожидаю, что тестовые сайты дадут такие же результаты, по крайней мере, в пределах нескольких процентов.

В настоящее время я не могу сделать вывод, какой вариант наиболее быстрый из-за несоответствия.

РЕДАКТИРОВАТЬ

Расширенный список тестов:

Не уверен, что лучше, но я бы пропустил jsben.ch (последний) по причинам, о которых упоминает Джоб: он не отображает количество запусков, погрешность или количество операций в секунду, что важен для оценки абсолютного влияния на производительность и обеспечения стабильного сравнения между эталонными сайтами и/или браузерами и версиями браузера.

(На данный момент http://jsbench.github.io мой любимый, так как он имеет все основные функции и позволяет вам локально редактировать фрагменты кода без необходимости каждый раз сохранять новую версию. Самый большой минус в том, что она не позвольте вам запустить только один фрагмент кода - я отправил запрос на добавление функций для этого.)

Ответ 1

Обновление за март 2019 года: результаты несовместимы между Firefox и Chrome - perf.zone ведет себя аномально в Chrome, jsben.ch ведет себя аномально в Firefox. До тех пор, пока мы точно не поймем, почему лучшее, что вы можете сделать, - это тестирование на нескольких веб-сайтах (но я бы все равно пропустил jsben.ch, другие дают вам хотя бы небольшую погрешность, а также статистику о том, сколько выполненных прогонов и т.д.)

TL; DR: запуск вашего кода на perf.zone и jsbench.github.io (см. Здесь и здесь), результаты близко соответствуют jsperf. Лично и по другим причинам, кроме этих результатов, я доверяю этим трем сайтам больше, чем jsben.ch.

Недавно я также попытался сравнить производительность конкатенации строк, но в моем случае он строил одну строку из 1000000+ односимвольных строк (join('') побеждает для таких больших и больших чисел, кстати). На моей машине тайм-аут jsben.ch вместо того, чтобы дать результат вообще. Возможно, он лучше работает на вашем, но для меня это большой предупреждающий знак:

http://jsben.ch/mYaJk

http://jsbench.github.io/#26d1f3705b3340ace36cbad7b24055fb

https://run.perf.zone/view/join-vs-concat-when-dealing-with-very-long-lists-of-single-character-strings-1512490506658

(Меня не беспокоит, что когда-либо приходится иметь дело с jsperf, not all tests inserted снова, извините)

На данный момент я подозреваю, но не могу доказать, что perf.zone имеет несколько более надежные результаты тестов:

  • при оптимизации lz-string я очень долго использовал jsbench.github.io, но в какой-то момент я заметил, что для некоторых типов кода были слишком большие поля ошибок, превышающие 100%.

  • с jsperf.com и perf.zone хорошо работать с тестами на мобильных устройствах, но jsbench.github.io довольно неудобно, и CSS не работает во время выполнения тестов.

Возможно, эти две вещи связаны между собой: возможно, метод, который jsbench.github.io использует для обновления DOM, вводит какие-то накладные расходы, которые влияют на тесты (они должны мета-тестировать это...).

Примечание: perf.zone не лишена своих недостатков. Иногда возникает тайм-аут при попытке сохранить эталонный тест (наихудшее время для этого...), и вы можете только обработать свой собственный код, а не редактировать его. Но вывод все еще более соответствует jsperf, и у него есть действительно хороший "быстрый" режим для одноразового бенчмаркинга.

Ответ 2

AFAIK одна проблема заключается в том, что различные движки JavaScript оптимизируют совершенно по-разному в зависимости от среды.

У меня есть тест на ту же функцию, которая дает разные результаты в зависимости от того, где была создана функция. Другими словами, например, в одном тесте это

const lib = {}
lib.testFn = function() {
   ....
}

И в других это

const lib = {
 testFn: function() {
   ....
 },
};

а в другом это

function testFn() {
   ....
}

const lib = {}
lib.testFn = testFn

и разница в результатах> 10% для нетривиальной функции в одном и том же браузере и разные результаты в разных браузерах.

То, что это означает, - отсутствие эталонного теста JavaScript - это правильно, потому что то, как этот тест выполняет тесты, как в самом тестовом жгуте, влияет на результаты. Например, жгут может использовать XHR тестового сценария. Мог бы позвонить Эвал. Можно запустить тест на рабочем. Можно запустить тест в iframe. И двигатель JS может оптимизировать все это по-разному.