Улучшить производительность метода синхронизации
Я использую этот модуль nodejs, чтобы измерить / профилировать, как долго выполняются части моего приложения.
// polyfill for window.performance.now
var performance = global.performance || {}
var performanceNow =
performance.now ||
performance.mozNow ||
performance.msNow ||
performance.oNow ||
performance.webkitNow ||
function(){ return (new Date()).getTime() }
// generate timestamp or delta
// see http://nodejs.org/api/process.html#process_process_hrtime
function hrtime(previousTimestamp){
var clocktime = performanceNow.call(performance)*1e-3
var seconds = Math.floor(clocktime)
var nanoseconds = Math.floor((clocktime%1)*1e9)
if (previousTimestamp) {
seconds = seconds - previousTimestamp[0]
nanoseconds = nanoseconds - previousTimestamp[1]
if (nanoseconds<0) {
seconds--
nanoseconds += 1e9
}
}
return [seconds,nanoseconds]
}
function clock(start) {
if ( !start ) return hrtime();
var end = hrtime(start);
return Math.round((end[0]*1000) + (end[1]/1000000));
}
module.exports = clock;
Использование довольно просто:time = benchmark();
начать счетчик и time = benchmark(time);
измерить продолжительность с момента предыдущего звонка.
Это включает в себя polyfill для того, когда мое приложение нужно запустить в браузере.
Эта функция, кажется, работает хорошо, но она серьезно (и по иронии судьбы) влияет на производительность, особенно (и это неудивительно) в Internet Explorer.
Как я могу сделать это быстрее?
1 ответ
Вы делаете много дополнительных вычислений...
// polyfill for window.performance.now
var performance = global.performance || {}
var performanceNow =
performance.now ||
performance.mozNow ||
performance.msNow ||
performance.oNow ||
performance.webkitNow ||
function(){ return (new Date()).getTime() }
function clock(start) {
if ( !start ) return performanceNow();
var end = performanceNow();
return end - start;
}
module.exports = clock;
Этот код должен давать те же результаты. (Math.round опущен)
Все методы (performance.now & Date.getTime) возвращают время в миллисекундах. Насколько я понимаю, это ожидаемый выходной.
Производительность теперь в некоторых браузерах (Chrome) может предоставить вам дополнительную долю миллисекунды, тогда возвращаемое значение будет не-int
например
> performance.now()
160693.10000000405
Также проверьте производительность методов извлечения времени:
На Chrome и на моем компьютере Date.now() дает максимальную скорость, утраивая производительность performance.now()
см. https://jsperf.com/get-time-3482/1
Date.now performance.now
Chrome 10 MOps 3.5 MOps
Safari 10 MOps 7 MOps
Если вы выполняете несколько прогонов или измеряете большие промежутки времени, дополнительная наносекундная точность может не потребоваться
Тогда вы получите код IE9+:
var now = Date.now;
function clock(start) {
if ( !start ) return now();
var end = now();
return end - start;
}
module.exports = clock;
=====
Дополнительные примечания:
Производительность performance.now по сравнению с Date.now на процессорах Intel и AMD может и должна отличаться
Они используют различные инструкции процессора, чтобы получить время, пожалуйста, посмотрите здесь некоторые детали, http://zeromq.org/results:more-precise-0mq-tests