【发布时间】:2011-08-20 04:41:10
【问题描述】:
我有一系列像 void (*callbacks[n])(void* sender) 这样的回调,我想知道这些代码中的哪一个会更快地执行:
//Method A
void nullcallback(void* sender){};
void callbacka(void* sender)
{
printf("Hello ");
}
void callbackb(void* sender)
{
printf("world\n");
}
int main()
{
void (*callbacks[5])(void* sender);
unsigned i;
for (i=0;i<5;++i)
callbacks[i] = nullcallback;
callbacks[2] = callbacka;
callbacks[4] = callbackb;
for (i=0;i<5;++i)
callbacks[i](NULL);
};
或
//Method B
void callbacka(void* sender)
{
printf("Hello ");
}
void callbackb(void* sender)
{
printf("world\n");
}
int main()
{
void (*callbacks[5])(void* sender);
unsigned i;
for (i=0;i<5;++i)
callbacks[i] = NULL;
callbacks[2] = callbacka;
callbacks[4] = callbackb;
for (i=0;i<5;++i)
if (callbacks[i])
callbacks[i](NULL);
};
一些条件:
- 我知道我的大部分回调是否有效是否重要?
- 如果我使用 C 或 C++ 编译器编译我的代码会有什么不同吗?
- 目标平台(windows、linux、mac、iOS、android)是否会改变结果中的任何内容? (这个回调数组的全部原因是为了管理游戏中的回调)
【问题讨论】:
-
哇,微小的微优化。这就是分析的用途。尽管null pointers,有一些关于 LKML 的有趣讨论,主题类似。
-
方法 B 更快。因为调用函数会比 NULL 比较消耗更多时间。
-
您的编译器、您的架构和您的应用程序。对这两种方法计时,并记住结果可能不适用于不同的编译器、不同的架构或不同的应用程序。
-
基准,基准,基准。
-
除非你有分析器的输出来确认它的重要性,否则请不要进入这个。与此同时,做任何能产生更干净代码的事情。