我有一个带有enum
成员变量的类。其中一个成员函数将其行为基于此enum
,因此作为“可能的”优化,我将两种不同的行为作为两个不同的函数,并且我给类一个在构造时设置的成员函数指针。我模拟了这样的情况:
enum catMode {MODE_A, MODE_B};
struct cat
{
cat(catMode mode) : stamp_(0), mode_(mode) {}
void
update()
{
stamp_ = (mode_ == MODE_A) ? funcA() : funcB();
}
uint64_t stamp_;
catMode mode_;
};
struct cat2
{
cat2(catMode mode) : stamp_(0), mode_(mode)
{
if (mode_ = MODE_A)
func_ = funcA;
else
func_ = funcB;
}
void
update()
{
stamp_ = func_();
}
uint64_t stamp_;
catMode mode_;
uint64_t (*func_)(void);
};
然后我创建一个 cat 对象和一个长度数组32
。我遍历数组将其放入缓存中,然后调用猫更新方法32
时间并将延迟使用存储rdtsc
在数组中......
rand()
然后我使用,ulseep()
和一些任意的 ..调用一个循环数百次的函数,然后我再次strcmp()
执行此操作32
。
结果是带有分支的方法似乎总是在44
+/-10
循环左右,而带有函数指针的方法往往在130
. 我很好奇为什么会出现这种情况?
如果有的话,我会期待类似的表现。此外,模板化几乎不是一种选择,因为真正的 cat 类针对该功能的完全专业化将是矫枉过正的。