优化性能,同时减少模板的使用

optimizing performance while reducing use of template

本文关键字:性能 优化      更新时间:2023-10-16

在我的应用程序中,通过为结构引入特殊情况,我获得了大约2x的速度提升。

简化后的代码是这样的:
class SpecialCase
{
   private:
      size_t values[10];
   public:
      void foo();
};
class GenericCase
{
   private:
      std::vector<size_t> values;
   public:
      void foo();
};
template <class Case> void bar()
{
   Case case;
   case.foo();
}
void somewhereElse()
{
   if ( boring_runtime_condition )
   {
      bar<SpecialCase>();
   }
   else
   {
      bar<GenericCase>();
   }
}
这段代码没有问题,但现在我必须通过另一个类扩展应用程序:
class Problem
{
   private:
      std::vector<Case> cases;
   public:
      Case doSomething();
};

要同时处理SpecialCase和GenericCase,我必须使整个类成为模板。由于我有几个特殊的情况,这大大减慢了编译速度。我一点也不喜欢。

在运行应用程序时,我从不混合使用SpecialCase和GenericCase。我非常希望不必在每个方法中将Case强制转换为特定类型,因为这会使代码膨胀,其他开发人员可能会忘记它。

是否有一个好的方法来避免这种模板疯狂?(也欢迎c++ 11解决方案)

免责声明:请不要告诉我std::vector有多好,我不应该使用特殊情况。我测量了性能,所以请不要留言说你不相信2倍的加速。

如果您不想创建大量的std::vector实例,您可以创建一个小的代理类,它通过引用存储所有内容,并仅在该类中强制转换。如果它很小,实例化不会太慢。

template<class T>
class Problem {
    private:
        std::vector< some_smart_pointer > cases;
    public:
        T cast(Case* x) {
             return (T*)x;
        }
        T doSomething() {
             //doing something
              return cast(returnValue);
        }
};

我将类命名为Problem,但最好将其他层ProxyVector仅用作代理并在Problem中使用