2013-06-25 46 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