Мне нужно получить время выполнения в миллисекундах.
Первоначально я задавал этот вопрос еще в 2008 году. Тогда был принят новый ответ: использовать Date (). GetTime (). Однако теперь мы все можем согласиться с тем, что использование стандартного API performance.now () более целесообразно. Поэтому я меняю принятый ответ на этот.
javascript
profiling
Юлий А
источник
источник
Date
способом, который дает вамms
и достаточно для большинства случаев, я думаю, albertech.blogspot.com/2015/07/… ... но да, вы действительно должны смотретьPerformance.now
performance.now()
не работает в Node.new Date().getTime()
будет работать в узле.Ответы:
Использование performance.now () :
Использование console.time :
(Нестандартные)(уровень жизни )Примечание :
Строка существо передача до
time()
иtimeEnd()
методы должны совпадать(для таймера до конца , как и ожидалось).
источник
использовать новый Date (). getTime ()
ех.
источник
window.performance.now
. См stackoverflow.com/a/15641427/632951Не используйте Date (). Читай ниже.
Используйте
performance.now()
:Работает на:
IE 10 ++
FireFox 15 ++
Chrome 24 ++
Safari 8 ++
Опера 15 ++
Android 4.4 ++
и т. д.
console.time
может быть жизнеспособным для вас , но это нестандартное § :Помимо поддержки браузера,
performance.now
кажется, есть потенциал для обеспечения более точных сроков, поскольку это, кажется, пустая версияconsole.time
.<rant> Также НИКОГДА не используйте
Date
для чего-либо, потому что это зависит от изменений в «системном времени». Что означает, что мы будем получать некорректные результаты -кака «отрицательное времени» - когда пользователь не имеет точное время системы:(Установите системные часы на год назад и перейдите в Gmail, чтобы мы все могли посмеяться. Возможно, когда-нибудь у нас будет Зал позора для JS
Date
.)Google Spreadsheet's
now()
Функция также страдает от этой проблемы.Единственное время, которое вы будете использовать,
Date
это когда вы хотите показать пользователю его системное время. Не тогда , когда вы хотите получить на время или для измерения ничего.источник
Если вам нужно получить время выполнения функции на вашем локальном компьютере разработки , вы можете использовать инструменты профилирования вашего браузера или консольные команды, такие как
console.time()
иconsole.timeEnd()
.Все современные браузеры имеют встроенные профилировщики JavaScript. Эти профилировщики должны давать наиболее точные измерения, поскольку вам не нужно изменять существующий код, что может повлиять на время выполнения функции.
Для профилирования вашего JavaScript:
Кроме того, на своем компьютере разработки вы можете добавить инструментарий в свой код с помощью
console.time()
иconsole.timeEnd()
. Эти функции, поддерживаемые в Firefox11 +, Chrome2 + и IE11 +, сообщают о таймерах, через которые вы запускаете / останавливаетеconsole.time()
.time()
принимает заданное пользователем имя таймера в качестве аргумента, аtimeEnd()
затем сообщает о времени выполнения с момента его запуска:Обратите внимание, что только Firefox возвращает прошедшее время в
timeEnd()
вызове. Другие браузеры просто сообщают результат на консоль разработчика: возвращаемое значениеtimeEnd()
не определено.Если вы хотите узнать время выполнения функции , вам придется использовать свой код. У вас есть пара вариантов. Вы можете просто сохранить время начала и окончания, выполнив запрос
new Date().getTime()
:Однако
Date
объект имеет разрешение только в миллисекундах и будет зависеть от изменений системных часов любой ОС. В современных браузерах есть лучший вариант.Лучший вариант - использовать High Resolution Time , иначе
window.performance.now()
.now()
лучше традиционногоDate.getTime()
в двух важных аспектах:now()
является двойным с субмиллисекундным разрешением, которое представляет количество миллисекунд с начала навигации по странице. Возвращает количество микросекунд в дробной части (например, значение 1000.123 равно 1 секунде и 123 микросекундам).now()
монотонно увеличивается. Это важно, поскольку при последующих вызовахDate.getTime()
может произойти скачок вперед или даже назад. Примечательно, что если системное время ОС обновляется (например, синхронизация атомных часов),Date.getTime()
также обновляется.now()
гарантированно всегда будет монотонно увеличиваться, поэтому на него не влияет системное время ОС - оно всегда будет временем настенных часов (при условии, что ваши настенные часы не атомарные ...).now()
может быть использован практически в каждом месте , чтоnew Date().getTime()
,+ new Date
ANDTDate.now()
есть. Исключением является то , чтоDate
иnow()
времена не смешиваются, так какDate
основан на Unix-эпохи (количество миллисекунд с 1970 года), в то время какnow()
это число миллисекунд , прошедших с вашей страницы навигации началась (так он будет гораздо меньше , чемDate
).Вот пример того, как использовать
now()
:now()
поддерживается в стабильных Chrome, Firefox 15+ и IE10. Также доступно несколько полифилл .Еще одна опция для измерения времени выполнения в дикой природе - UserTiming . UserTiming ведет себя так же, как
console.time()
иconsole.timeEnd()
, но использует ту жеnow()
метку времени с высоким разрешением, которая использует (так что вы получаете монотонно увеличивающиеся часы на доли миллисекунды), и сохраняет метки времени и длительности в PerformanceTimeline .UserTiming имеет понятия меток (временных меток) и мер (длительностей). Вы можете определить столько, сколько хотите, и они отображаются на PerformanceTimeline .
Чтобы сохранить метку времени, звоните
mark(startMarkName)
. Чтобы узнать длительность с момента первой отметки, просто позвонитеmeasure(measurename, startMarkname)
. Затем продолжительность сохраняется в PerformanceTimeline вместе с вашими отметками.UserTiming доступен в IE10 + и Chrome25 +. Есть также доступный polyfill (который я написал).
источник
performance.now
Date
Чтобы получить точные значения, вы должны использовать интерфейс производительности . Он поддерживается в современных версиях Firefox, Chrome, Opera и IE. Вот пример того, как его можно использовать:
Date.getTime()
илиconsole.time()
не подходят для точного измерения времени выполнения. Вы можете использовать их, если вам подходит быстрая грубая оценка. Под грубой оценкой я имею в виду, что вы можете получить 15-60 мс сдвиг от реального времени.Посмотрите этот блестящий пост по измерению времени выполнения в JavaScript. Автор также дает пару ссылок о точности времени JavaScript, которое стоит прочитать.
источник
Используйте Firebug, включите и консоль, и Javascript. Нажмите Профиль. Reload. Нажмите Профиль еще раз. Посмотреть отчет.
источник
console.time()
иconsole.timeEnd()
тоже сейчас.эталонный тест
Вывод
performance.now () является необязательным - просто передайте false в функцию конструктора StopWatch.
источник
process.hrtime () доступен в Node.js - он возвращает значение в наносекундах
источник
hrtime[0] * 1000 + hrtime[1] / 1000000
-> да, я тоже используюvar hrtime
! : PВы можете использовать оператор добавления также здесь
источник
Для дальнейшего расширения кода vsync, чтобы иметь возможность возвращать timeEnd в качестве значения в NodeJS, используйте этот маленький кусочек кода.
Теперь используйте код так:
Это дает вам больше возможностей. Вы можете сохранить время выполнения, которое будет использоваться для других целей, таких как использование его в уравнениях или сохранение в базе данных, отправка удаленному клиенту через веб-сокеты, обслуживание на веб-странице и т. Д.
источник
Можно использовать только одну переменную:
timer/1000
- конвертировать миллисекунды в секунды.toFixed(5)
- обрезать лишние цифрыисточник
Так как
console.time
иperformance.now
не поддерживаются в некоторых основных браузерах (например, IE10), я создал тонкую утилиту, которая использует лучшие доступные методы. Тем не менее, он не обрабатывает ошибки для ложных использований (вызовEnd()
неинициализированного таймера).Используйте его и улучшайте как хотите.
источник
Это может помочь вам.
var t0 = date.now(); doSomething(); var t1 = date.now(); console.log("Call to doSomething took approximate" + (t1 - t0)/1000 + " seconds.")
источник
Вот декоратор для функций синхронизации
Применение:
Если вы используете асинхронные функции, вы можете сделать
timed
async и добавитьawait
перед f (... args), и это должно сработать. Это усложняется, если вы хотите, чтобы один декоратор обрабатывал функции синхронизации и асинхронности.источник
Спасибо, Ахим Кёльнер, немного расширит ваш ответ:
Обратите внимание, что вы не должны делать ничего, кроме того, что вы хотите измерить (например,
console.log
также потребуется время для выполнения и повлияет на тесты производительности).Обратите внимание, что для того, чтобы по мере выполнения времени выполнения асинхронных функций, вы должны вставить
var timeInMilliseconds = process.hrtime(t0)[1]/1000000;
внутри обратного вызова. Например,источник
Пару месяцев назад я собрал свою собственную подпрограмму, которая рассчитывает время с помощью функции Date.now () - хотя в то время принятым методом, как представляется, был performance.now () - потому что объект производительности еще не доступен (построен -in) в стабильном выпуске Node.js.
Сегодня я провел еще какое-то исследование и нашел другой метод определения времени. Так как я также нашел, как использовать это в коде Node.js, я решил поделиться этим здесь.
Следующее объединено с примерами, данными w3c и Node.js :
НОТА:
Если вы намереваетесь использовать
performance
объект в приложении Node.js, вы должны включить следующее требование:const { performance } = require('perf_hooks')
источник
performance.mark('end')
в этом случаеЕсть несколько способов достижения этой цели:
используя console.time
это самый эффективный способ: использование performance.now () , например
используйте + (добавить оператор) или getTime ()
Вот что происходит, когда вы применяете унарный оператор плюс к экземпляру Date: Получите значение рассматриваемого экземпляра Date. Преобразуйте его в число.
ПРИМЕЧАНИЕ:
getTime()
дает лучшую производительность, чем унарный + оператор.источник
InitTime связано с
string
.return Singleton.getInstance().initTime(label); // Returns the time init
return Singleton.getInstance().endTime(label); // Returns the total time between init and end
источник
Если вы хотите измерить время между несколькими вещами, которые не являются вложенными, вы можете использовать это:
Аналогичен console.time (), но более прост в использовании, если вам не нужно отслеживать предыдущие таймеры.
Если вам нравится синий цвет из console.time (), вы можете использовать эту строку вместо
источник
В моем случае я предпочитаю использовать @gramar suger и компилировать его с помощью babel.
Проблема этого метода в том, что функция должна быть внутри объекта.
Образец кода JS
.babelrc (для babel 6)
источник
Секундомер с накопительными циклами
Работает с сервером и клиентом (Node или DOM), использует
Performance
API. Хорошо, когда у вас много маленьких циклов, например, в функции, вызываемой 1000 раз, которая обрабатывает 1000 объектов данных, но вы хотите увидеть, как каждая операция в этой функции складывается в общую сумму.Так что этот использует глобальный (одиночный) таймер модуля. То же самое, что и шаблон синглтона класса, чуть проще в использовании, но вы должны поместить его в отдельный, например,
stopwatch.js
файл.источник
Лучший способ - использовать
performance hooks
модуль. Хотя нестабильный, вы можетеmark
конкретная области кода и между отмеченными областями.measure
duration
Попробуй здесь
источник
источник
С производительностью
NodeJs: требуется импортировать класс производительности
Использование console.time
источник
console.time("myTimer");
console.timeLog("myTimer");
console.timeEnd("myTimer");
Вы можете прочитать об этом на MDN и в документации Node.js .
Доступно в Chrome, Firefox, Opera и NodeJS. (не в Edge или Internet Explorer).
источник
Как указано ранее, проверьте и используйте встроенный таймер. Но если вы хотите или должны написать свой собственный вот мои два цента:
Сборник удался!
источник
Принятый ответ неверен !
Поскольку JavaScript является асинхронным, значения переменной end принятого ответа будут неверными.
Выполнение for может быть очень быстрым, поэтому вы не можете видеть, что результат неправильный. Вы можете проверить это с помощью кода, выполняющего некоторый запрос:
Таким образом, предупреждение будет выдано очень быстро, но в консоли вы увидите, что запросы ajax продолжаются.
Вот как вы должны это сделать: https://developer.mozilla.org/en-US/docs/Web/API/Performance.now
источник