1

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

定义:

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

与方法:

-(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
4

3 回答 3

5

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

于 2013-06-25T17:18:48.597 回答
5

如果您的调用次数足够多,则可能值得考虑性能,但请记住,您调用了十亿次。这意味着每次调用需要大约 9 纳秒的额外时间。这不是一个巨大的时间。另外,请记住,#define 是一个宏,这意味着它本质上是将代码复制粘贴到您调用它的任何地方。随心所欲地解释,这是你的选择,但我建议使用方法,因为它们更简单,更容易扩展等。如果有什么需要每次调用额外的 9 纳秒,无论如何它可能应该直接用 c 编写。

于 2013-06-25T17:23:32.077 回答
3

在十亿次迭代中节省了 9 秒。

如何从没有看到该宏并试图弄清楚它的作用中节省时间。checkUtility也不是一个非常明确的方法名称。你现在认为它是有道理的,当你在两个月后回到它时,你会想知道你在做什么,然后你必须查一下。与宏相同。无论哪种方式,您都优化了代码并节省了 9 秒,但您在搞清楚自己在做什么方面会浪费更多时间。

为人类而非机器编写代码

于 2013-06-25T18:32:46.800 回答