我想知道检查对象的分配(或其他东西)的正确方法是什么。我自己做了一些性能测试,发现没有方法调用的检查可以节省“巨大”的时间。哪种方式被视为良好的编码?测试和结果如下。
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
答案 0 :(得分:5)
预处理器宏很难看,尤其是当您尝试使用它们模拟函数时。所以不要这样做。与此同时,我怀疑这是你的算法的瓶颈。如果是,那么最好制作一个内联函数,让编译器完成它的优化工作。
答案 1 :(得分:5)
如果您打的电话足够多,可能值得考虑一下性能,但请记住,您称之为十亿次次。这意味着每次呼叫需要大约9纳秒。那不是一个巨大的时间。另外,请记住#define是一个宏,意味着它实际上会将代码粘贴到您调用它的任何地方。你可以解释它,这是你的选择,但我建议使用方法,因为它们更简单,更容易扩展等。如果有任何需要每次调用额外9纳秒的东西,它应该用直接c写。< / p>
答案 2 :(得分:3)
这比十亿次迭代节省了9秒。
如果没有看到那个宏并试图找出它的作用,你可以节省多少时间。 checkUtility
也不是一个非常清晰的方法名称。你认为这是有道理的,当你在两个月内回到它时你会想知道你在做什么,然后你将不得不查找它。与宏相同。无论哪种方式,你已经优化了你的代码并节省了9秒,但是你要浪费的不仅仅是弄清楚你在做什么。