Улучшить производительность метода синхронизации

Я использую этот модуль 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

Другие вопросы по тегам