2013-06-25 90 views
1

我想知道什麼是正確的方式去檢查對象的分配(或其他事情)。我自己做了一些性能測試,發現在沒有方法調用的情況下進行檢查可以節省「大量」時間。哪種方式被認爲是良好的編碼?下面的測試和結果。#define vs self.method檢查分配

的定義:

#define checkUM if (!um) {um = [[UtilityMaster alloc]init]; } 

VS的方法:用於檢查

-(void) checkUtility { 
    if (!um) {um = [[UtilityMaster alloc]init]; } 
} 

代碼:

int imax = 1000000000; 
int i = 0; 
IFD100(@"check method") 
while (i <= imax) { 
    [self checkUtility]; 
    i++; 
} 
IFD100(@"check method end") 
i = 0; 
IFD100(@"check define") 
while (i <= imax) { 
    checkUM; 
    i++; 
} 
IFD100(@"check define end") 

校驗1:

2013-06-25 18:36:16.712 check method 
2013-06-25 18:36:27.669 check method end <-- 10.957 secs 
2013-06-25 18:36:27.670 check define 
2013-06-25 18:36:30.128 check define end <-- 2.458 secs 

檢查2:

2013-06-25 18:37:18.900 check method 
2013-06-25 18:37:28.678 check method end <-- 9.778 secs 
2013-06-25 18:37:28.679 check define 
2013-06-25 18:37:31.136 check define end <-- 2.457 secs 
+0

時差是宏不做的10億次方法調用。 – rmaddy

+0

順便說一句 - 你的日誌語句是顛倒過來的。您記錄「檢查定義」,然後測試方法調用。 – rmaddy

+0

是的,我喜歡這個逆轉太haha – mrosales

回答

5

預處理程序是醜陋的,特別是如果你正試圖用它們來模擬功能。所以不要這樣做。同時,我懷疑這是你算法的瓶頸。如果是的話,那麼最好製作一個內聯函數,讓編譯器對其進行優化。

+0

內聯函數看起來很有趣,我將閱讀它們。至於宏,我發現它們非常有用否定重複代碼(如使用NSLog進行調試)。 – drUniversalis

5

如果您撥打的電話足夠多,可能需要考慮性能,但請記住,您稱它爲億次次。這意味着每次通話需要大約9納秒。這不是一個很大的時間。另外,請記住#define是一個宏,意思是它基本上是將代碼粘貼到您稱之爲的任何位置。按照你的意思解釋,這是你的選擇,但是我建議使用方法,因爲它們更簡單,更容易擴展等。如果有任何需要每次調用額外9納秒的任何東西,它應該直接寫成c。

3

這比10億次迭代節省了9秒。

如何節省您從看不到該宏,並試圖找出它的功能。另外checkUtility不是一個非常明確的方法名稱。你認爲現在是有道理的,當你在兩個月內回來時,你會想知道你在做什麼,然後你就必須去查看它。與宏一樣。無論如何,您已經優化了您的代碼並保存了9秒鐘,但是您會浪費更多的時間來確定您正在做什麼。

Write Code For Humans Not Machines

+0

checkUtility僅用於測試目的,它已被刪除。 – drUniversalis

+0

至於命名和宏,「UtilityMaster」 - >「um」僅供我個人使用/需要。迄今爲止,它在我的所有項目中都得到了實施,並使我不再一次又一次地編寫簡單的任務。我明白,也許有一天別人可能不得不使用我的代碼,我確信我自己的課程評論很重。 – drUniversalis

+0

BTT:我發現,把我寫代碼的時間與設備需要的實際計算時間相比,我感到非常不安。如果十億人實際上每天多次使用該應用程序,那麼我認爲將它們設置得甚至是嚴重疏忽。另外不要忘記,這個測試是在模擬器上進行的,iPhone 4s在1.5億分鐘內完成了1.5分鐘,而這些十億次迭代則耗時0.5分鐘。其中一大塊就是我想的迭代本身。 Sry擔任三重職位,第一次編輯時間太晚,第​​二次編輯時間太遲。 – drUniversalis