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 倍以上の値になります。