Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使性能关键方法调用C++中多态性的最快方法?_C++_Performance_Polymorphism - Fatal编程技术网

使性能关键方法调用C++中多态性的最快方法?

使性能关键方法调用C++中多态性的最快方法?,c++,performance,polymorphism,C++,Performance,Polymorphism,我有以下问题。类A有一组方法compute1、compute2、compute3。。。每一个都有深度嵌套的循环,其中调用了一些性能关键的方法。根据运行时条件,此方法应为func1或func2: class A { public: void compute1(){ for(i...) for(j...) for(k...) // call func1(i,j,k) or func2(i,j,k) }

我有以下问题。类A有一组方法compute1、compute2、compute3。。。每一个都有深度嵌套的循环,其中调用了一些性能关键的方法。根据运行时条件,此方法应为func1或func2:

class A {
public:
   void compute1(){
       for(i...)
         for(j...)
           for(k...)
             // call func1(i,j,k) or func2(i,j,k)
   }

   void compute2(){
       for(i...)
         for(j...)
           for(k...)
             // call func1(i,j,k) or func2(i,j,k)
   }
   ....
}
对func的调用对性能至关重要,因此func中的if语句是不可接受的。计算方法的数量很大,因此为每个func创建单独的方法也不是一个选项。出于性能原因,使func虚拟也不起作用。 由于设计原因,我不想让类A成为一个模板,它是巨大的,包含大量的逻辑,所以我不想把所有这些都放到头文件中


这个问题还有其他解决办法吗?在运行时切换多个后端看起来很常见,但我找不到一种可接受的方法来实现这一点…

一种可能的方法是让方法计算1等。使用模板本身。该模板将仅用于选择要调用的适当内部函数。例如:

template <typename FuncTrait>
void A::compute1(FuncTrait trait)
{
    for (...)
      choose_func(trait);
}

struct trait_1 {};

template <>
void choose_func<trait_1>(trait_1)
{
    func1();
}

一种可能的方法是让方法compute1等使用模板本身。该模板将仅用于选择要调用的适当内部函数。例如:

template <typename FuncTrait>
void A::compute1(FuncTrait trait)
{
    for (...)
      choose_func(trait);
}

struct trait_1 {};

template <>
void choose_func<trait_1>(trait_1)
{
    func1();
}

你衡量过你的表现吗?如今,虚拟方法很少成为瓶颈。编译器有时会在可能的情况下将它们内联,在不可能的情况下,CPU的分支预测器和i-cache将根据您的访问模式消除可测量的成本。。。那么,你的衡量标准是什么?在担心性能之前,先衡量一下!您认为的代码真的是一个瓶颈吗?这是你认为的瓶颈吗?不要因为您认为可能存在问题而忽略解决方案,始终首先测量和分析。定义“由于性能原因不起作用”。这只是一个额外的间接过程,远远快于您所设想的任何替代方案。如果可以的话,最明显的选择是在循环之外做出决策,即每个方法编写两组循环。或者模板:您不必将所有模板实现逻辑放入头文件中,因此反对意见是虚假的。两个问题:选择调用func1或func2的标准是什么?i、 它是否依赖于i,j或k,而b是i,j和k独立的?如果是这样的话,有一个关于并行性的论点。@WhiZTiM这里的问题是这个方法被调用了数十亿次,所以即使是一个小的开销也是不可容忍的。根据我的测量,虚拟方法的执行速度慢了约2倍。你测量过你的性能吗?如今,虚拟方法很少成为瓶颈。编译器有时会在可能的情况下将它们内联,在不可能的情况下,CPU的分支预测器和i-cache将根据您的访问模式消除可测量的成本。。。那么,你的衡量标准是什么?在担心性能之前,先衡量一下!您认为的代码真的是一个瓶颈吗?这是你认为的瓶颈吗?不要因为您认为可能存在问题而忽略解决方案,始终首先测量和分析。定义“由于性能原因不起作用”。这只是一个额外的间接过程,远远快于您所设想的任何替代方案。如果可以的话,最明显的选择是在循环之外做出决策,即每个方法编写两组循环。或者模板:您不必将所有模板实现逻辑放入头文件中,因此反对意见是虚假的。两个问题:选择调用func1或func2的标准是什么?i、 它是否依赖于i,j或k,而b是i,j和k独立的?如果是这样的话,有一个关于并行性的论点。@WhiZTiM这里的问题是这个方法被调用了数十亿次,所以即使是一个小的开销也是不可容忍的。根据我的测量,虚拟方法的执行速度慢了约2倍。其变体是接受对func1或func2本身的引用作为模板参数:模板其变体是接受对func1或func2本身的引用作为模板参数:模板