0

我目前正在尝试分析共享库。不幸的是,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不同意)。

4

0 回答 0