2012-06-12 2 views
1

Я знаю, что QueryPerformanceCounter() может использоваться для функций синхронизации. Я хочу знать:Внутренняя работа таймера

1-Можно ли увеличить разрешение таймера путем чрезмерной синхронизации CPU (так что галочки быстрее)?

2-В основном, что делает некоторые таймеры более точными, чем другие (например, QueryPerformanceCounter() более точен по сравнению с GetTickCount())? Если на материнской плате есть монокристаллический осциллятор, почему некоторые таймеры работают медленнее по сравнению с другими?

ответ

3
  1. QueryPerformanceCounter имеет очень высокое разрешение - обычно меньше одной наносекунды. Я не понимаю, почему вы хотели бы увеличить его. Разгон увеличит его, но это похоже на очень слабую причину разгона.

  2. QueryPerformanceCounter очень точный, но несколько дорогой и не очень удобный.
    a. Это дорого, потому что он использует дорогостоящую инструкцию rdtsc. Более быстрые таймеры могут просто читать целое число из памяти. Это целое число необходимо обновить, и мы не хотим делать это слишком часто (1000 раз в секунду разумно), поэтому мы получаем очень дешевый таймер с низкой точностью. Это в основном GetTickCount.
    b. Это неудобно, потому что он использует единицы, которые меняются между компьютерами. Иногда это наносекунды, иногда полунано или другие ценности. С этим сложнее вычислять.
    a. Другим источником неудобств является то, что он возвращает очень большие числа, которые могут переполняться, когда вы пытаетесь сделать с ними математику, поэтому вам нужно быть осторожным.

0

1 - Да, внутренне один из лучших таймеров - rdtsc, который дает вам значение часов. Объединение этого с информацией из инструкции cpuid дает вам время.

2 - Другие таймеры полагаются, например, на различные источники синхронизации, такие как таймер 8253.

QPF - это оболочка, дополненная Microsoft и предоставляющая то, что предоставляет rdtsc. Прочитайте эту статью для получения дополнительной информации: http://www.strchr.com/performance_measurements_with_rdtsc

1

Источник синхронизации для QPC зависит от машины. Обычно он выбирается из частоты, доступной где-то в наборе микросхем. Независимо от того, повлияет ли разгон процессора, он сильно зависит от дизайна вашей материнской платы. Самый простой способ - просто попробовать, используйте QueryPerformanceFrequency, чтобы увидеть эффект.

GetTickCount управляется из совершенно другого источника таймера, сигнала, который также генерирует прерывание тактового сигнала. Это не очень точно, 1/64 секунды нормально, но он очень точен. Время от времени аппарат связывается с сервером времени, чтобы перекалибровать часы и настроить коэффициент коррекции тактового сигнала. Это делает его точным примерно на секунду в течение целого года. QPC очень точен, но не так точна. Используйте его только для коротких интервалов времени.

Смежные вопросы