我試圖在iOS優化功能(進行FFT),我已經建立了一個測試程序,它的計時執行過幾百個電話。我在函數調用之前和之後使用mach_absolute_time()來計時。我正在對運行iOS 6的iPod touch第4代進行測試。不穩定時序結果()
大部分計時結果彼此大致一致,但偶爾一次運行需要比其他時間長得多(長達100倍) 。
我很肯定這與我的實際功能無關。每次運行具有相同的輸入數據,並且是純數字計算(即沒有系統調用或內存分配)。如果我用其他空的for循環替換FFT,我也可以重現這一點。
有沒有其他人注意到這樣的事情?
我目前的猜測是,我的應用程序的線程以某種方式被操作系統中斷。如果是這樣,有什麼辦法可以防止這種情況發生? (這是不是一個應用程序,會在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倍或更多的值。
而不是直接從main()運行我的測試,我現在從一個新的線程運行它們。我使用pthreads創建線程,將策略設置爲SCHED_FIFO,並將優先級設置爲最大值。這並不能消除這個問題,但平均時間現在已經足夠有用了。不過,我很想知道是否有更有效的方法來防止中斷。 – sjmerel