【发布时间】:2012-05-29 10:32:42
【问题描述】:
我正在实现一个循环缓冲区来存储固定大小的数据结构,如队列。这个循环缓冲区用三个参数初始化:-
/*
* Initialize the ring buffer.
* @capacity Max capacity of ring buffer.
* @item_size Fixed size of item that will be put in this circular buffer.
* @item_cleaner Clean callback, NULL if cleanup not required.
*/
ringbuf*
ringbuf_create(size_t capacity, size_t item_size, clean_up_cb item_cleaner)
我的循环缓冲区始终处于wrapping 模式,这意味着当新项目放入完整的循环缓冲区时,最后一项总是被替换。由于动态分配的对象也可以放入这个缓冲区,因此循环缓冲区会保持引用一个清理回调函数,以便在替换或删除项目时释放它们。但同时这个回调函数也可以是NULL(不需要清理的时候)。在我的代码中到处都有这样的语句:-
if(buffer->callback != NULL)
buffer->callback(item);
现在,为了防止这些if 语句,当用户不提供任何回调函数时,我放置了空存根函数。这会阻止我每次检查回调函数是否为NULL。
使用这种方法,我的代码看起来很整洁。但我不确定,其中哪一个更快?在装配级别上,empty function call 和 if statement 在速度方面有何关联?它们是等价的吗?
【问题讨论】:
-
你测量一下怎么样?或者,如果性能非常重要并且代码执行频繁(不太可能,你有证据证明它很重要吗?)你可以使用预处理器生成一个没有回调的版本。
-
试试看。还要记住,在大多数处理器上,
if的性能取决于选择哪一侧的可预测性(所以当你尝试它时,让测试做一些现实的事情)。如果您要问性能问题,请包括您的目标平台——它与代码本身一样重要。 -
视情况而定。编译器?优化级别?
-
这取决于编译器、编译器设置、目标架构、ABI 和实际处理器。所以真正的答案需要这些数据。我的情况是,我会使用更整洁的代码。它可能更快或更慢,但都不会太多。
-
如果你吸引到一个关于精打细算的演讲,不要感到难过 :)
标签: c performance