2

iOS で関数 (FFT) を最適化しようとしています。テスト プログラムをセットアップして、数百回の呼び出しでその実行時間を計測しました。関数呼び出しの前後に mach_absolute_time() を使用して時間を計っています。iOS 6 を実行している iPod touch 第 4 世代でテストを行っています。

ほとんどのタイミング結果は互いにほぼ一致していますが、場合によっては、1 つの実行が他の実行よりもはるかに長く (100 倍も) かかることがあります。

これは私の実際の機能とは何の関係もないと確信しています。各実行には同じ入力データがあり、純粋に数値計算です (つまり、システム コールやメモリ割り当てはありません)。FFT を空の for ループに置き換えると、これを再現することもできます。

他の誰かがこのようなことに気づいたことがありますか?

私の現在の推測では、私のアプリのスレッドは何らかの形で OS によって中断されています。もしそうなら、これが起こらないようにする方法はありますか?(これは App Store でリリースされるアプリではないため、公開されていない API で問題ありません。)

私はもう iOS 5.x デバイスを持っていませんが、iOS 6 へのアップデート前にはこの問題は発生していなかったと確信しています。

編集:再現する簡単な方法は次のとおりです。

for (int i = 0; i < 1000; ++i)
{                                         
    uint64_t start = mach_absolute_time();
    for (int j = 0; j < 1000000; ++j);   
    uint64_t stop = mach_absolute_time(); 
    printf("%llu\n", stop-start);         
}                                         

これをデバッグでコンパイルし (for ループが最適化されないように)、実行します。ほとんどの値は 220000 前後ですが、場合によっては 10 倍以上の値になります。

4

3 に答える 3

1

アプリが別のスレッドで時間を費やしている間に発生します。

于 2014-07-13T02:00:24.980 に答える
1

私の経験では、mach_absolute_time は信頼できません。今は代わりに CFAbsoluteTime を使用しています。秒よりもはるかに優れた精度で現在の時刻を秒単位で返します。

const CFAbsoluteTime newTime = CFAbsoluteTimeGetCurrent();
于 2012-12-13T16:13:06.767 に答える
1

mach_absolute_time() は実際には非常に低レベルで信頼性があります。3GS から iPad 第 4 世代まで、すべての iOS デバイスで安定した 24MHz で動作します。また、タイミング情報を取得する最速の方法でもあり、CPU に応じて 0.5µs から 2µs かかります。しかし、別のスレッドに割り込まれた場合、もちろん、誤った結果が得られます。

最高の優先度を持つ SCHED_FIFO を使用すると、CPU を占有することができますが、せいぜい数秒間だけで、OS は貪欲すぎると判断します。タイミング テストを実行する前に sleep( 5 ) を試してみるとよいでしょう。

実際に新しいスレッドを開始する必要はありません。これにより、現在のスレッドの優先度を一時的に変更できます。

struct sched_param sched;
sched.sched_priority = 62;
pthread_setschedparam( pthread_self(), SCHED_FIFO, &sched );

sched_get_priority_min & max は保守的な 15 & 47 を返しますが、これは約 0.25 から 0.75 の絶対優先度にのみ対応することに注意してください。実際に使用できる範囲は 0 ~ 62 で、これは 0.0 ~ 1.0 に相当します。

于 2013-02-28T00:41:31.410 に答える