Source: lib/debug/timer.js

/**
 * @license
 * Copyright 2016 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

goog.provide('shaka.timer');

goog.require('shaka.log');


/**
 * @namespace shaka.timer
 * @summary A performance timing framework.
 *   Used in both debugging and production builds.
 */


/**
 * Begins a timer.
 *
 * @param {string} name
 */
shaka.timer.begin = function(name) {
  shaka.timer.timers_[name] = {
    begin: shaka.timer.now_(),
    end: NaN
  };
};


/**
 * End a timer and log (debug) the elapsed time.
 * Does nothing if the timer has not begun.
 *
 * @param {string} name
 */
shaka.timer.end = function(name) {
  var record = shaka.timer.timers_[name];
  if (!record) {
    return;
  }

  record.end = shaka.timer.now_();
  var diff = record.end - record.begin;
  shaka.log.debug(name + ': ' + diff.toFixed(3) + 'ms');
};


/**
 * Log (debug) the diff between two or more completed timers and return it.
 * Does nothing if not all of the timers have begun.
 *
 * @param {string} name1
 * @param {string} name2
 * @param {...string} var_args
 * @return {number} The diff between the timers, or NaN if they have not all
 *   completed.
 */
shaka.timer.diff = function(name1, name2, var_args) {
  var t1 = shaka.timer.get(name1);
  var t2 = shaka.timer.get(name2);
  if (!t1 || !t2) {
    return NaN;
  }
  var diff = t1 - t2;
  var name = name1 + ' - ' + name2;

  for (var i = 2; i < arguments.length; ++i) {
    var name3 = arguments[i];
    var t3 = shaka.timer.get(name3);
    if (!t3) {
      return NaN;
    }
    diff -= t3;
    name += ' - ' + name3;
  }

  shaka.log.debug(name + ': ' + diff.toFixed(3) + 'ms');
  return diff;
};


/**
 * Query a timer.
 *
 * @param {string} name
 * @return {number} The elapsed time in milliseconds, if the timer is complete.
 *   Returns NaN if the timer doesn't exist or hasn't ended yet.
 */
shaka.timer.get = function(name) {
  var record = shaka.timer.timers_[name];
  if (!record || !record.end) {
    return NaN;
  }

  return record.end - record.begin;
};


/** @private {function():number} */
shaka.timer.now_ = window.performance && window.performance.now ?
                       window.performance.now.bind(window.performance) :
                       Date.now;


/** @private {!Object.<string, {begin: number, end: number}>} */
shaka.timer.timers_ = {};