Вопрос

Я провожу быстрое тестирование некоторых программ на JavaScript, создавая объект Date и используя его для получения времени в миллисекундах до и после реальной работы функции. Я сделал тело простым добавлением цикла for, а затем в конце вычитаем старую ms из новой ms и печатаем ее. Однако все заканчивается за 0 миллисекунд ... что имеет смысл, поскольку время, когда я проверяю это с записью, одинаково до и после работы. Я делаю это правильно, и JavaScript (в Chrome) работает молниеносно, или есть какие-то закулисные вещи, которые портят мои переменные.

Это было полезно?

Решение

Хотя объект Date возвращает время в миллисекундах, на самом деле это не разрешение таймера, стоящего за ним. Например, таймер может срабатывать один раз каждые 10 мс. Если ваш процесс занимает всего 3 мс, то большую часть времени вы не увидите ненулевое измерение (а иногда вы увидите 10 мс).

Решение состоит в том, чтобы запускать вашу функцию много раз, а время - целиком. Например, запустите его миллион раз и разделите общее время на 1000000, чтобы получить среднее время одного запуска.

Другие советы

См. мой ответьте на этот вопрос о том, как вы могли бы реализовать некоторые простые сравнительные сравнения. Как отметил @Greg Hewgill, важно выполнить тест несколько раз, чтобы получить точное представление о том, как долго конкретный тест тестирует.

Как правило, все сводится к чему-то простому:

var MAX = 100000, i =  0, 
    s   = null,   e = null;

console.info("`someMethodToTest()` over %d iterations", MAX);
s = new Date();
do {
    someMethodToTest();
} while ( ++i < MAX );
e = new Date();

console.log("Total: %dms; average: %dms", +e - +s, (+e - +s) / MAX);

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

Кстати, вас может заинтересовать использование профилировщика JavaScript. Firebug для Firefox имеет хороший вариант. Вам просто нужно открыть консоль и нажать Профиль .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top