Как использовать QueryPerformanceCounter?

Для подведения итогов то, что я изучил до сих пор:

Вот Основная функция, которая делает Class.extend () работой в jQuery (Скопированный от Простое Наследование JavaScript John Resig):

// Inspired by base2 and Prototype
(function(){
  var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;

  // The base Class implementation (does nothing)
  this.Class = function(){};

  // Create a new Class that inherits from this class
  Class.extend = function(prop) {
    var _super = this.prototype;

    // Instantiate a base class (but only create the instance,
    // don't run the init constructor)
    initializing = true;
    var prototype = new this();
    initializing = false;

    // Copy the properties over onto the new prototype
    for (var name in prop) {
      // Check if we're overwriting an existing function
      prototype[name] = typeof prop[name] == "function" &&
        typeof _super[name] == "function" && fnTest.test(prop[name]) ?
        (function(name, fn){
          return function() {
            var tmp = this._super;

            // Add a new ._super() method that is the same method
            // but on the super-class
            this._super = _super[name];

            // The method only need to be bound temporarily, so we
            // remove it when we're done executing
            var ret = fn.apply(this, arguments);       
            this._super = tmp;

            return ret;
          };
        })(name, prop[name]) :
        prop[name];
    }

    // The dummy class constructor
    function Class() {
      // All construction is actually done in the init method
      if ( !initializing && this.init )
        this.init.apply(this, arguments);
    }

    // Populate our constructed prototype object
    Class.prototype = prototype;

    // Enforce the constructor to be what we expect
    Class.constructor = Class;

    // And make this class extendable
    Class.extend = arguments.callee;

    return Class;
  };
})();

, Как только Вы работали, выполнил этот код, тогда это делает следующий код от ответ insin возможный:

var MyWidget = Class.extend({
  init: function(widget_name){
    this.widget_name = widget_name;
  },

  doSomething: function() {
    alert('my name is ' + this.widget_name);
  }
});

Это - хорошее, чистое решение. Но мне интересно видеть, есть ли у кого-либо решение, которое не требует добавления ничего к jQuery.

94
задан Evan Carslake 30 August 2015 в 19:22
поделиться

2 ответа

#include <windows.h>

double PCFreq = 0.0;
__int64 CounterStart = 0;

void StartCounter()
{
    LARGE_INTEGER li;
    if(!QueryPerformanceFrequency(&li))
    cout << "QueryPerformanceFrequency failed!\n";

    PCFreq = double(li.QuadPart)/1000.0;

    QueryPerformanceCounter(&li);
    CounterStart = li.QuadPart;
}
double GetCounter()
{
    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return double(li.QuadPart-CounterStart)/PCFreq;
}

int main()
{
    StartCounter();
    Sleep(1000);
    cout << GetCounter() <<"\n";
    return 0;
}

Эта программа должна вывести число, близкое к 1000 (спящий режим Windows не такой точный, но должен быть как 999).

Функция StartCounter () записывает количество тиков счетчика производительности в переменную CounterStart . Функция GetCounter () возвращает количество миллисекунд с момента последнего вызова StartCounter () как двойное, поэтому, если GetCounter () возвращает 0,001, значит, оно было примерно через 1 микросекунду с тех пор, как был вызван StartCounter () .

Если вы хотите, чтобы таймер использовал секунды, вместо этого измените

PCFreq = double(li.QuadPart)/1000.0;

на

PCFreq = double(li.QuadPart);

или, если вы хотите микросекунды, используйте

PCFreq = double(li.QuadPart)/1000000.0;

Но на самом деле речь идет об удобстве, так как он возвращает двойное значение.

155
ответ дан 24 November 2019 в 06:06
поделиться

Эта статья, безусловно, является наиболее полным ответом на этот замечательный вопрос:

отказы магазинов приложений

В сообщении также есть ссылки на другие ресурсы по этой теме.

Удачи, Мэтью

Информация в статье включает:

Ошибки
HIG Облегченные версии Интернет
Возможности подключения (отличная информация, которую вы, возможно, удивитесь, прочитав)
Чрезмерное использование полосы пропускания более
Возможности устройств сотовых сетей чтобы сделать именно то, что вам нужно).

На платформах, отличных от Windows, нет функции QueryPerformanceCounter, поэтому решение не будет напрямую переносимым. Однако, если вы обернете его в класс, такой как вышеупомянутый HRTimer , будет легче изменить реализацию класса, чтобы использовать то, что текущая платформа действительно может предложить (возможно, через Boost или что-то еще. !).

2
ответ дан 24 November 2019 в 06:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: