от
Я портирование игры, которая изначально была написана для API-интерфейса Win32, на Linux (ну, переносом порта х порта для Win32 на Linux). Я реализовал
QueryPerformanceCounter
, давая uSeconds поскольку процесс запуска:
BOOL QueryPerformanceCounter(LARGE_INTEGER* performanceCount)
{
    gettimeofday(

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

11 Ответы

0 голосов
от
Я портирование игры, которая изначально была написана для API-интерфейса Win32, на Linux (ну, переносом порта х порта для Win32 на Linux). Я реализовал
QueryPerformanceCounter
, давая uSeconds поскольку процесс запуска:
BOOL QueryPerformanceCounter(LARGE_INTEGER* performanceCount)
{
    gettimeofday(
0 голосов
от
Может быть. Но у вас большие проблемы.
gettimeofday()
может привести к неправильным тайминги, если есть процессы в системе, которые изменяют таймер (т. е. нтпд). На "нормальный" Линукс, хотя, я считаю, что постановление
gettimeofday()
составляет 10 мкс. Он может прыгать вперед и назад и время, следовательно, исходя из процессов, запущенных на вашей системе. Это эффективно делает ответ на ваш вопрос нет. Вы должны смотреть на
clock_gettime(CLOCK_MONOTONIC)
для интервалов времени. Он страдает несколько меньше проблем из-за таких вещей, как многоядерные системы и параметры внешней синхронизации. Кроме того, посмотрите на функцию
clock_getres()
.
0 голосов
от
Высокое разрешение, низкую затратность времени для процессоров Intel Если вы на Intel, вот как прочтешь процессора в реальном времени счетчик команд. Это скажет вам число процессорных циклов, выполняемых с момента процессор был загружен. Это, вероятно, лучший мелкозернистый счетчика вы можете сделать для измерения производительности. Обратите внимание, что это количество циклов процессора. На Linux вы можете получить скорость процессора из /proc/cpuinfo и делить, чтобы получить количество секунд. Преобразование этого двойной-это очень удобно. Когда я запускаю это на мой ящик, я вам
11867927879484732
11867927879692217
it took this long to call printf: 207485
Вот руководство Intel для разработчиков, что дает тонн деталь.
#include
0 голосов
от
@Бернард: Я должен признать, что большинство ваших примеров пошел прямо над моей головой. Он компилируется, и, кажется, работает, хотя. Это безопасно для SMP систем или она? Это хороший вопрос... я думаю, что код в порядке. С практической точки зрения, мы используем его в своей компании каждый день, и мы бежим на довольно широкий спектр коробок, все от 2-8 ядер. Конечно, YMMV, и т. д., Но это, кажется, надежность и низкие накладные расходы (потому что это не делает переключение контекста в системе-пространство) метод времени. Вообще как это работает: объявить блока кода на ассемблере (и фитонциды, поэтому оптимизатор будет оставить его в покое). выполнение инструкции CPUID. В дополнение к получению некоторой информации процессором (что мы ничего не делаем С) она синхронизирует буфер выполнения процессора так что тайминги не изменяются по порядку исполнения. выполнения rdtsc (метка читать) исполнения. Это загружает количество машинных циклов, выполняемых с момента процессор был сброшен. Это 64-битный значение, поэтому с текущих процессора ускоряет его будет обтекать каждый 194 лет. Интересно, что в оригинале Ссылка Пентиум, они отмечают его обтекает каждый 5800 лет. последние пару строк хранения значений из регистров в переменные Hi и Lo, и положить, что в 64-бит возвращаемого значения. Особые Примечания: из-за того, исполнение может привести к неверным результатам, поэтому мы выполняем "с CPUID" инструкция, которая в дополнение к давая вам некоторую информацию о процессоре также синхронизирует любом порядке исполнения инструкции. Большинство ОС синхронизировать счетчики на ЦП, когда они начинают, так ответ Хорошо бы в пару нано-секунд. В спячке комментарий Это, пожалуй, верно, но на практике вы вероятно, плевать на тайминги через границы гибернации. о Она: новые процессоры Intel компенсировать скорость изменения и возвращает скорректированный счет. Я сделал быстрое сканирование за некоторые из коробок в нашей сети и нашли только одну коробку, что не было ее: Пентиум 3 работает какой-то старый сервер базы данных. (эти коробки Linux, поэтому я проверил с помощью команды grep constant_tsc в /proc/cpuinfo для) Я не уверен насчет процессоров АМД, мы в первую очередь Интел-магазин, хотя я знаю, что некоторые из наших систем низкого уровня гуру сделал Оценка драмов. Надеюсь, это удовлетворит ваше любопытство, интересно и (ИМХО) изучалось области программирования. Вы знаете, когда Джефф и Джоэл были говорим о том, или не программист должен знать C? Я был кричать на них: "Эй забывать, что на высоком уровне с вещами... ассемблер то, что вы должны научиться, если вы хотите знать, что компьютер делаю!"
0 голосов
от
Вы можете быть заинтересованы в FAQ Linux для
clock_gettime(CLOCK_REALTIME)
0 голосов
от
Вино на самом деле с помощью gettimeofday() для реализации QueryPerformanceCounter() и это, как известно, делают много игр Windows работать на Linux и Mac. Начинается http://source.winehq.org/source/dlls/kernel32/cpu.c#L312 приводит к http://source.winehq.org/source/dlls/ntdll/time.c#L448
0 голосов
от
Так он говорит микросекунд явно, но говорит, что разрешение системных часов является неуказанным. Я предполагаю, что разрешение в данном контексте означает, как минимальное количество, что он будет увеличиваться? Структура данных определяется как наличие микросекунд в качестве единицы измерения, но это не значит, что часы или операционная система способны измерять что мелко. Как и другие люди предположили,
gettimeofday()
это плохо, потому что установка времени может привести к разнице во времени и скинуть свой расчет.
clock_gettime(CLOCK_MONOTONIC)
является то, что вы хотите, и
clock_getres()
скажет вам в точности ваших часов.
0 голосов
от
Фактическое разрешение gettimeofday() зависит от аппаратной архитектуры. Процессоров Intel, а также машины СПАРК предлагаем таймеры высокого разрешения, которые измеряют микросекунд. Других аппаратных архитектур вернуться к таймер системы, который обычно устанавливается до 100 Гц. В таких случаях временным разрешением будут менее точными. Я получил этот ответ от высокое разрешение измерения времени и таймеры, Часть I
0 голосов
от
Этот ответ упоминает проблемы с часы корректируются. Обе ваши проблемы, гарантируя клеща единиц и проблемы со временем корректируются решаются в C 11 с библиотекой
0 голосов
от
Из моего опыта, и из того, что я читал в интернете, ответ "Нет", это не гарантируется. Это зависит от скорости процессора, операционной системы, разновидность Linux, и т. д.
...