我目前正在尝试分析共享库。不幸的是,sprof 似乎无法在我的系统上运行,所以我使用的是 oprofile。
但是,当我调查分析数据时,大部分时间都被指示用于模板化方法。这是意料之中的,因为大多数数字计算都是在该方法中进行的。但是,opreport 表明时间花费在此模板的某个专业化上。这可以解释为什么计算看起来比它应该的要慢。其中一些专业包括优化的代码,而另一些则不包括,并且 opreport 表明时间花在了优化程度较低的版本上。共享对象包括实例化的两个版本,但我必须知道决定使用哪一个的代码是否正常工作。
我cout
在模板中添加了一些 s,这些似乎表明采取了正确的专业化,但我仍然对 opreport 输出感到困惑。
编辑:
这里有一些关于我在做什么的更多细节。代码必须能够运行任何长度的输入,但如果我知道大小,我可以优化它。所以我正在做这样的事情:
template<size_t N>
struct simulator {
static void run(...) // optimized version for known N
};
template<>
struct simulator<0> {
static void run(...) // unoptimized version for any size
};
void simulate(....) {
switch(n) {
case(1):
simulator<1>::run(...);
break;
case(2):
simulator<2>::run(...);
break;
...
default:
simulator<0>::run(...);
}
}
在实际代码中,我使用了一些模板魔术来允许代码优化为的最大数量#define
,但想法是相同的。现在我需要确保,simulator<0>::run()
当它不应该被调用时,它真的从未被调用过。但是 opreport 表明只有这个运行,但没有其他(cout
不同意)。