Сроки в JavaScript - PullRequest
       30

Сроки в JavaScript

2 голосов
/ 30 ноября 2009

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

Ответы [ 3 ]

5 голосов
/ 30 ноября 2009

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

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

2 голосов
/ 30 ноября 2009

См. Мой ответ на этот вопрос , чтобы узнать, как можно реализовать некоторые простые сравнительные сравнения. Как отметил @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);
1 голос
/ 30 ноября 2009

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

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

...