Улучшить производительность метода синхронизации - PullRequest
0 голосов
/ 25 апреля 2018

Я использую этот модуль 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); для измерения длительности с момента предыдущего вызова.

Это включает в себя полизаполнение, когда мое приложение должно запускаться в браузере.

Кажется, что функция работает хорошо, но сильно (и по иронии судьбы) влияет на производительность, особенно (что неудивительно) в Internet Explorer.

Как я могу сделать это быстрее?

1 Ответ

0 голосов
/ 02 мая 2018

Вы делаете много дополнительных вычислений ...

// 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 CPU

Они используют разные инструкции процессора для получения времени, пожалуйста, посмотрите здесь некоторые детали, http://zeromq.org/results:more-precise-0mq-tests

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...