2016-04-02 3 views
0

Все, что я хочу сделать, это захватить системные тактовые значения, чтобы я мог измерять время между ними, чтобы сравнить скорости альтернативных кодировок с помощью Free Pascal на Mac с OSX.Доступ к системным часам из свободного паскаля на Mac OSX?

Документация Free Pascal больше касается дат и брутто-марок времени, чем о системных часах, насколько я могу судить по их онлайн-документации. Значения системных часов будут намного точнее.

Мои исследования здесь, в stackoverflow, не находят ничего конкретного в моей ситуации.

Я был в состоянии сделать это с помощью Xcode в родном приложении OSX, но я бы хотел использовать Free Pascal для этого приложения из-за его перекрестной переносимости.

Кто-нибудь нашел, как сделать то, что мне нужно? Спасибо.

+1

Похоже, что вы ищете 'mach_absolute_time' в Libc, которые кросс-платформенная поддержка обручах Делх в блок System.Diagnostics в 'TStopWatch'. Это может дать вам кое-что, что нужно искать в FP. –

+0

@Ken спасибо. Вы поставили меня на путь, который в конечном итоге попал в подразделение EpikTimer в Лазаресе. Я нахожу, что его легко реализовать (см. Примитивы ниже), но, похоже, имеет разрешение в микросекундах. Хорошо, но процедуры, которые я тестирую, нуждаются в еще более тонком разрешении. Я продолжу видеть, можно ли настроить EpikTimer для более точного разрешения. У Lazarus также есть FPTimer, но реализовать его не так просто, хотя я могу оказаться там. использует EpikTimer; T: удлинен; EpkTime: = TEpikTimer.Create (nil); EpkTime.Clear; EpkTime.Start; ... T: = EpkTime.Elapsed EpkTime.Free; – Lor

+0

Взял слишком много времени, чтобы отредактировать вышеизложенное, извините за раздавленный код. – Lor

ответ

0

Функция для этого gettickcount64, но AFAIK, что не переключиться на clock_gettime (CLOCK_MONOTONIC) еще на OS X и до сих пор использует fpgettimeofday

Кажется, что mach_absolute_time не подвергается в любом месте, но вы можете быть может объявить импорт самостоятельно. Вы также можете проверить заголовок univint для функций системы Carbon. Возможно, в одном из заголовков MIDI или (Core) Audio есть что-то для точного хронометража

+0

В отличие от документации FPC, в sysutils не поддерживается ни gettickcount, ни gettickcount64. Ошибка компиляции заключается в том, что идентификатор не найден. Где еще (какая другая единица) может поддержать его/их? Благодарю. – Lor

+0

Sysutils, я проверил ветку исправлений (версии 3.0.x для исправлений после 3.0.0). Класс Classes.TThread также имеет метод, возвращающий его.В любом случае, как сказано для OS X, это не так интересно, поскольку в OS X используются простые старые часы –

0

Поэтому я в значительной степени решил свою проблему, написав функцию, которая использует встроенный код ассемблера. Для моей цели достаточно длинной длинной части счетчика. Если счетчик будет накапливаться в 32 бита высокого порядка во время тестового прогона, мое вычитание начала из конечных значений даст отрицательный ответ, поэтому я снова запустил тест. К сожалению, разница в тике часов включает тики во время фоновых процессов, поэтому мне нужно минимизировать активные процессы во время тестирования.

 function HdweTick: longint; assembler; 
     asm 
      RDTSC 
      movl %eax,__result 
     end; 

Если вам действительно нужен 64 бит тиканье часов счетчик, вы можете сделать это:

 function HdweTick: int64; 
     type truc = record 
       case ovlay: integer of 
       0: (eax, edx :longint); 
       1: (val64 :int64 ); 
       end; 
     var trec :truc; 
     begin 
      asm 
       RDTSC 
       movl %eax,trec.eax 
       movl %edx,trec.edx 
      end; 
      HdweTick := trec.val64; 
     end; 
Смежные вопросы