2012-10-08 45 views
2

我試圖在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倍或更多的值。

+0

而不是直接從main()運行我的測試,我現在從一個新的線程運行它們。我使用pthreads創建線程,將策略設置爲SCHED_FIFO,並將優先級設置爲最大值。這並不能消除這個問題,但平均時間現在已經足夠有用了。不過,我很想知道是否有更有效的方法來防止中斷。 – sjmerel

回答

0

根據我的經驗,mach_absolute_time不可靠。現在我改用CFAbsoluteTime。它以秒爲單位返回當前時間,精度比第二個更好。

const CFAbsoluteTime newTime = CFAbsoluteTimeGetCurrent(); 
1

mach_absolute_time()實際上是非常低的水平和可靠的。它在所有iOS設備上運行穩定的24MHz,從3GS到iPad第四代。這也是獲取定時信息的最快方式,取決於CPU,取決於0.5μs和2μs。但是如果你被另一個線程打斷,當然你會得到虛假的結果。

SCHED_FIFO最大優先將讓你養豬的CPU,但只有最多幾秒鐘,然後OS決定你這個人太貪婪。在運行計時測試之前,您可能想嘗試睡眠(5),因爲這會產生一些「信用」。

你實際上並不需要開始一個新的線程,可以暫時用這個改變當前線程的優先級:

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

注意sched_get_priority_min &最大返回一個保守的15 & 47,但這僅對應於約0.25至0.75的絕對優先級。實際可用範圍是0到62,對應於0.0到1.0。

0

它發生時,應用程序花費一些時間在另一個線程。