我有一组像这样的回调 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)是否改变了结果? (这个回调数组的全部原因是为了管理游戏中的回调)
您必须为此查看汇编代码。在我的平台(gcc,32 位)上,我发现编译器无法优化对 nullcallback
的调用。但是,如果我将您的方法 A 改进为以下内容
int main(void) {
static void (*const callbacks[5])(void* sender) = {
[0] = nullcallback,
[1] = nullcallback,
[2] = callbacka,
[3] = nullcallback,
[4] = callbackb,
};
for (unsigned i=0;i<5;++i)
callbacks[i](0);
};
编译器能够展开循环并优化调用结果只是
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $0, (%esp)
call callbacka
movl $0, (%esp)
call callbackb
xorl %eax, %eax
leave
ret
.size main, .-main
我是一名优秀的程序员,十分优秀!