2016-04-02 4 views
0

私がしたいのは、システムクロックの値を取得して、OSXでFree Pascalを使用している別のコーディングの速度を比較するために、それらの間の時間を測定できるようにすることです。mac osxのフリー・パスカルからシステム・クロックにアクセスしますか?

Free Pascalのドキュメントは、オンラインドキュメントから収集できる限り、システムクロックについての日付と総タイムスタンプの詳細です。システムクロックの値はずっと正確です。

ここで私の研究は私の状況に特有のものは何も見つかりません。

ネイティブOSXアプリケーションでXcodeでこれを行うことができましたが、クロスプラットフォームの移植性のためにこのアプリケーションにFree Pascalを使用したいと思います。

誰かが私に必要なものをする方法を見つけましたか?ありがとうございました。このため

+1

あなたがlibcの 'mach_absolute_time'探している表示されます、Delphiのクロスプラットフォームサポートのラップで:あなたは本当にクロックティック・カウントの64ビットが必要な場合は、あなたがこれを行うことが

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

'TStopWatch'にSystem.Diagnosticsユニットを追加します。それは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ですが、それはOS X上ではまだにclock_gettime(CLOCK_MONOTONIC)に切り替えて、まだfpgettimeofday

を使用していないことがmach_absolute_timeはどこにも公開されていないようですが、あなたがかもしれ私の知る限りでは、宣言することができますあなた自身を輸入する。カーボンシステムの機能についてはunivintヘッダーをチェックすることもできます。おそらく、MIDIや(Core)Audioヘッダーの1つに正確な計時のためのものがあるかもしれません。

+0

FPCのマニュアルとは異なり、sysutilsではgettickcountもgettickcount64もサポートされていません。コンパイルエラーは、識別子が見つからないことです。他の場所(他のどのユニット)がそれをサポートするか?ありがとう。 – Lor

+0

Sysutils、私はfixesブランチをチェックしました(3.0.xシリーズ以降の修正については3.0.xシリーズ)Classes.TThreadクラスにもメソッドがありました。とにかくOS Xについて言われているように、それはOS X上で普通の古い時計を使用しているので面白くない –

0

私はインラインアセンブラコードを使用する関数を書いて問題を解決しました。カウンターの下位の長い部分は私の目的には十分です。テスト実行中にカウンタが上位32ビットに累積すると、最終値からの開始を減算すると否定的な答えが返されるため、テストを再実行します。残念ながら、クロックティックの違いにはバックグラウンドプロセス中のティックが含まれているため、テスト中にアクティブなプロセスを最小限に抑える必要があります。

 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; 
関連する問題