2010-07-10 52 views
4

對於一個普通的應用程序,你永遠不會想這樣做。強制iPhone模擬執行CPU密集型任務嗎?

但是...我正在製作一個教育應用程序,以向人們展示在不同的iPhone硬件和操作系統級別的不同線程模型會發生什麼。 OS 4從根本上改變了不同的模型(IME:在OS 4上運行時大量現有的代碼不起作用)。我正在編寫一個交互式測試應用程序,可以讓你爲不同的模型(選擇器主線程,選擇器背景,nsoperationqueue等)啓動線程,並查看發生時GUI +主應用程序會發生什麼。

但是我想重現的一個常見用例是:「執行backgorund下載的線程然後執行CPU密集型結果分析」。我們在真實世界的應用程序中看到了很多。

這並非完全無關緊要; 「忙」的方式很重要。

那麼...我怎麼模擬這個?我正在尋找一些保證不會被優化編譯器(現在或者更好的編譯器)拋出的東西,並且足以強制線程在最大CPU上運行約5秒鐘。

注意:在我的真實世界的應用程序中,我注意到當iPhone線程忙碌時會發生一些奇怪的事情 - 例如,後臺線程會使主線程餓死,即使設置爲低優先級。雖然這顯然是Apple線程調度程序中的一個錯誤,但我想要做一個忙碌的事情來證明這一點 - 和/或一個忙碌的替代方案,它顯示了當您不在調度程序中觸發該行爲時發生的情況。

UPDATE:

例如,下面可以有不同的效果:

for(int i=0; i<1000; i++) 
    for(int k=0; k<1000; k++) 
    CC_MD5(cStr, strlen(cStr), result); 

for(int i=0; i<1000000; i++) 
    CC_MD5(cStr, strlen(cStr), result); 

......有時,至少,編譯器似乎優化後(我不知道是什麼編譯巫術是對於 - 些構建它沒有明顯差異,一些它確實:()

更新2:

25個線程,在第一代iPhone,做的Millio每個MD5都有...並且在GUI上幾乎沒有可察覺的效果。

5個線程使用捆綁的基於SAX的解析器解析XML通常會使GUI停止。

看來,MD5哈希不會觸發iPhone的馬車線程調度:(這些問題。我要去調查MEM分配代替,看看是否有不同的效果。

+1

你剛剛說過,你想模擬一個「執行backgorund下載的線程,然後執行CPU密集型結果分析的線程」。你爲什麼不這樣做?即下載一堆隨機文件並在其上應用處理例程(如md5),但使用像100個線程。 – 5ound 2010-07-10 19:24:03

+0

@ 5ound這應該是一個答案..你會得到我的+1,如果是的話。沒有人應該要求代碼在沒有任何工作的情況下自行構建。你的想法足以得到答案。 – Jann 2010-07-10 22:27:45

+0

Jann - 它不起作用(我認爲它不那麼簡單)。這個理論是微不足道的,但實踐是什麼讓我難過:) – Adam 2010-07-10 23:06:47

回答

1

你能避免編譯器優化東西拿走通過確保編譯器不能輕易地推斷出你想在編譯的時候做什麼

例如,這樣的:

for(int i=0; i<1000000; i++) 
    CC_MD5(cStr, strlen(cStr), result); 

有一個不變的輸入,所以編譯器可能會意識到它會得到sa我每次都會有結果。或者結果沒有被使用,所以它不需要計算它。 你可以同時避免這些問題,像這樣:

for(int i=0; i<1000000; i++) 
{ 
    CC_MD5(cStr, strlen(cStr), result); 
    sprintf(cStr, "%02x%02x", result[0], result[1]); 
} 

如果你使用SAX看到的問題,那麼我會用得到的線程在你的模擬應用做SAX啓動,並檢查您看到了同樣的問題在你的主應用程序之外。

如果問題與純處理器能力或內存分配無關,則可以查看的其他方面是磁盤I/O(取決於xml輸入的來源),互斥鎖或調用選擇器/委託。

祝你好運,並做你的回報!

+0

是的,這是個好主意,謝謝。我會嘗試在交替循環中翻轉它們,然後在循環之後進行nslog操作,以保持編譯器不會進行優化。 – Adam 2010-07-12 20:52:37

1

Apple實際上提供了與developer.apple.com相似的示例代碼,目的是強調使用LibXML(SAX)和CocoaXML之間的性能差異。重點不在CPU性能上,但假設您可以實際測量處理器利用率,那麼您可能只需放大(在您的xml中重複)樣本下載的數據集即可。

+0

我以前沒有發現過這個例子 - 很好找,謝謝! – Adam 2010-07-12 20:50:47