2010-06-02 49 views
0

我試圖拼湊在一起,並運行一個由用戶放在一起的任務列表。這些任務列表可能長達數百或數千個項目。msg_send調用會產生多少開銷?

據我所知,最簡單,最明顯的辦法是建立一個數組,然後遍歷它們:

NSArray *arrayOfTasks = .... init and fill with thousands of tasks 

for (id *eachTask in arrayOfTasks) 
{ 
    if (eachTask && [eachTask respondsToSelector:@selector(execute)]) [eachTask execute]; 
} 

對於臺式機,這可能是沒有問題的,但在iPhone或iPad這可能是一個問題。這是一個好方法嗎?還是有更快的方法來完成同樣的事情?

我之所以問msg_send發生了多少開銷,是因爲我也可以做一個直接的C實現。例如,我可以放置一個鏈表並使用一個塊來處理下一個任務。我會從中得到什麼,或者比它的價值更麻煩嗎?

+1

您不需要檢查'eachTask'是否爲非零。如果'eachTask'爲零,或者它不響應'execute','respondsToSelector:'將導致NO。 – dreamlax 2010-06-03 07:49:39

+2

無論如何,你不會從NSArray中獲得「無」值。 – kperryua 2010-06-03 14:57:36

+2

'id *'在這裏寫錯了 – newacct 2012-09-17 22:26:59

回答

6

我假設你在談論objc_msgSend,在這種情況下,Bill Bumgarner擁有非常棒的 4 Part Series值得一讀。

一般來說,我會推薦使用Obj-C。這就是iDevices使用的所有應用程序(包括Apple)以及數百個項目都不會殺死該設備。

+0

+1好文章 – shosti 2010-06-03 03:39:03

+0

謝謝!偉大的文章! – pxl 2010-06-03 07:40:25

+0

只是我評論的附錄......我喜歡深入瞭解事物的內容,而且蘋果的文檔只做到目前爲止...所以這真的是一篇很棒的文章! – pxl 2010-06-03 07:45:41

0

rynmrtn說什麼......

除非你-execute方法是非常簡單的 - 遞增/測試標量值的極少數 - 那麼它是不可能的,即使objc_msgSend()將顯示爲你的程序的% CPU時間。

先測量後優化。

您的代碼確實提出了一個問題;爲什麼你把東西放進arrayOfTasks,可能無法使用execute。假設您的arrayOfTasks中的所有內容都是您製作的子類,則可以添加execute方法,而不要執行響應測試。如果你有一個集合類的層次結構,你可以使用類別來添加方法 - 只要在他們的前面加上一個前綴來保證安全(即pxl_execute或其他)。

+0

我可能應該使用僞代碼,但想法是通過數千個對象的列表,並調用每個對象的方法 – pxl 2010-06-03 07:42:27

0

Here是一個很好的基準比較常用操作,包括objc_msgSend。一般來說,即使在iPhone上,您也不必擔心其性能。消息發送總是比直接的C函數調用慢,但在現代處理器上(請記住,iPhone處理器仍然大約爲500 mhz),但大多數情況下這種差異是微不足道的。如果剖析顯示在objc_msgSend中正在使用大量時間,則可能值得使用直接C函數而不是Objective-C方法。

爲了清楚起見,您可以使用-[NSArray makeObjectsPerformSelector:]或(在Mac上)enumerateObjectsUsingBlock:而不是遍歷對象,但我認爲它不會帶來太多的性能差異。

+0

謝謝!從評論和我自己閱讀的內容來看,我真的不應該太擔心objc_msgSend,而只是想出一些有用的東西。然後,像你所建議的那樣,運行性能基準測試並開始找出所有瓶頸和緩慢點。 – pxl 2010-06-03 07:44:14

相關問題