高解像度のタイミングはプラットフォーム固有であり、質問で指定していません。標準ライブラリの clock() 関数は、毎秒 CLOCKS_PER_SEC でインクリメントするカウントを返します。一部のプラットフォームでは、必要な解像度を得るのに十分な速さである場合がありますが、実装で定義されているため、システムのティック レートを確認する必要があります。ただし、十分に高い場合は、次のようにします。
#define SAMPLE_PERIOD_MS 100
#define SAMPLE_PERIOD_TICKS ((CLOCKS_PER_SEC * SAMPLE_PERIOD_MS) / 1000)
int k=0;
int total=100;
clock_t measure_time = clock() + SAMPLE_PERIOD_TICKS ;
while(k<total)
{
doSomething();
if( clock() - measure_time > 0 )
{
measure();
measure_time += SAMPLE_PERIOD_TICKS ;
++k;
}
}
必要に応じて、clock() を他の高解像度クロック ソースに置き換えることができます。
ただし、いくつかの問題に注意してください。このメソッドは「ビジー ループ」です。doSomething() または measure() のいずれかが CPU を生成しない限り、プロセスは可能な限りすべての CPU サイクルを使用します。これがターゲットで実行されている唯一のコードである場合、それは問題ではない可能性があります。一方、これがリアルタイムではない Windows や Linux などの汎用 OS で実行されている場合、プロセスが他のプロセスによってプリエンプトされる可能性があり、これがサンプリング周期の精度に影響を与える可能性があります。正確なタイミングが必要な場合は、RTOS を使用し、doSomething() と measure() を別々のスレッドで実行することをお勧めします。より良いGPOSでも。たとえば、一般的なパターン (仕様がない場合に作成された API を使用する) は次のようになります。
int main()
{
StartThread( measure_thread, HIGH_PRIORITY ) ;
for(;;)
{
doSomething() ;
}
}
void measure_thread()
{
for(;;)
{
measure() ;
sleep( SAMPLE_PERIOD_MS ) ;
}
}
のコードは、実行にほとんど時間がかからないmeasure_thread()
場合にのみ正確です。measure()
かなりの時間がかかる場合は、それを考慮する必要があります。非決定論的である場合は、スリープ期間を差し引くために実行時間を測定する必要がある場合もあります。