У меня есть jsperf test case, и результат довольно запутанный. У меня есть три «фрагменты»:Как я могу избежать «оптимизации» моих тестовых примеров javascript?
- умножения
- деление
- управления (ни операция выполняется)
и большую часть времени, все они выходят примерно с той же скоростью .. даже контроль! Я догадался, что JS JIT-компилятор был removing my "unnecessary" instructions, когда они, похоже, не имели никакого эффекта; поэтому я начал accumulating the results, and logging them to the console, когда тестовый цикл был выполнен, например.
for (var i = 0; i < nNumbers; i++) {
result += a[i]/b[i];
}
console.log(result);
Но тогда у меня были дико отличающиеся результаты, когда консоль была открыта, когда она не была. Замедление работы с консольными протоколами, казалось, подавляло любые другие проблемы с производительностью.
Итак, я попытался прокрутить число итераций внутри каждого «фрагмента», чтобы свести к минимуму количество записей в журнале относительно операций, которые я пытаюсь проверить. Но у меня все еще нет существенной разницы в скорости между тремя фрагментами. Действительно, деление и умножение имеют одинаковую скорость, как оценка константы ?? Я должен делать что-то неправильно. Или jsperf сломан.
Уже есть ответы на связанные вопросы, но ни один из них, который я нашел для теста Javascript.
- How can I prevent the Rust benchmark library from optimizing away my code?
- How can I be sure that the compiler doesn't optimize away my performance test?
Я получил, ops сек: mult: 126k, div: 33k, control: 282k, как и ожидалось, так как разделение медленное для компьютеров. http://jsperf.com/multiplication-vs-division-lars/2 – dandavis
@dandavis Я получаю аналогичные результаты – BeyelerStudios
, которые сказали, что диаграмма, похоже, не работает правильно, но сами цифры были в порядке. – dandavis