#define vs self.method用于检查分配

时间:2013-06-25 17:10:56

标签: ios objective-c performance cocoa-touch c-preprocessor

我想知道检查对象的分配(或其他东西)的正确方法是什么。我自己做了一些性能测试,发现没有方法调用的检查可以节省“巨大”的时间。哪种方式被视为良好的编码?测试和结果如下。

define:

#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

3 个答案:

答案 0 :(得分:5)

预处理器宏很难看,尤其是当您尝试使用它们模拟函数时。所以不要这样做。与此同时,我怀疑这是你的算法的瓶颈。如果是,那么最好制作一个内联函数,让编译器完成它的优化工作。

答案 1 :(得分:5)

如果您打的电话足够多,可能值得考虑一下性能,但请记住,您称之为十亿次次。这意味着每次呼叫需要大约9纳秒。那不是一个巨大的时间。另外,请记住#define是一个宏,意味着它实际上会将代码粘贴到您调用它的任何地方。你可以解释它,这是你的选择,但我建议使用方法,因为它们更简单,更容易扩展等。如果有任何需要每次调用额外9纳秒的东西,它应该用直接c写。< / p>

答案 2 :(得分:3)

这比十亿次迭代节省了9秒。

如果没有看到那个宏并试图找出它的作用,你可以节省多少时间。 checkUtility也不是一个非常清晰的方法名称。你认为这是有道理的,当你在两个月内回到它时你会想知道你在做什么,然后你将不得不查找它。与宏相同。无论哪种方式,你已经优化了你的代码并节省了9秒,但是你要浪费的不仅仅是弄清楚你在做什么。

Write Code For Humans Not Machines