2016-04-02 43 views
0

我想要做的就是獲取系統時鐘值,以便我可以測量它們之間的時間,以便比較使用Mac OS上的Free Pascal替代編碼的速度。從mac osx上的免費pascal訪問系統時鐘?

就我可以從他們的在線文檔中收集的信息而言,免費的Pascal文檔更多地是關於日期和總時間戳而不是系統時鐘。系統時鐘值將更精確。

我在這裏的研究stackoverflow找到沒有具體到我的情況。

我已經能夠在本地OSX應用程序中使用Xcode執行此操作,但由於其跨平臺可移植性,我希望爲此應用程序使用Free Pascal。

有沒有人找到我需要做的?謝謝。

+1

看樣子你正在尋找'mach_absolute_time' libc中,在Delphi的跨平臺支持包裹「TStopWatch」中的System.Diagnostics單位。這可能會讓你在FP中尋找一些東西。 –

+0

@Ken謝謝。你讓我走上了一條最終到達拉扎魯斯EpikTimer單位的道路。我發現它很容易實現(見下面的基元),但似乎有一個微秒的分辨率。好的,但我測試的例程需要更高的分辨率。我會繼續看看EpikTimer是否可以調整到更好的分辨率。拉扎魯斯也有FPTimer,但實現起來並不那麼容易,儘管我可能會在那裏結束。 使用EpikTimer; T:延長; EpkTime:= TEpikTimer.Create(nil); EpkTime.Clear; EpkTime.Start; ... T:= EpkTime.Elapsed EpkTime.Free; – Lor

+0

花了很長時間來編輯上述內容,對於破碎的代碼抱歉。 – Lor

回答

0

此功能是gettickcount64,但據我所知還沒有切換到clock_gettime(CLOCK_MONOTONIC),但在OS X和仍然使用fpgettimeofday

似乎mach_absolute_time沒有任何地方暴露出來,但你可能可以申報自己導入。您還可能需要檢查Carbon系統功能的univint標題。也許MIDI或(核心)音頻標題之一有精確的計時

+0

與FPC文檔相反,sysutils不支持gettickcount和gettickcount64。編譯錯誤是找不到標識符。 (還有哪些單位)可以支持它/他們?謝謝。 – Lor

+0

Sysutils,我檢查修復分支(3.0.0修復後的3.0.x系列)Classes.TThread類也有一個方法返回它。無論如何,對於OS X來說,它並不是那麼有趣,因爲它在OS X上使用普通的舊時鐘 –

0

所以我通過編寫一個使用內聯彙編代碼的函數來解決我的問題。櫃檯的低階longint部分足以達到我的目的。如果計數器會在測試運行過程中累積到高位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;