C++函数指针与Switch

Raw*_*awr 18 c++ performance

  • 什么是更快:功能指针或开关?

switch语句大约需要30 case秒,包括从0到30的被禁止的无符号整数.

我可以做以下事情:

class myType
{
    FunctionEnum func;
    string argv[123];
    int someOtherValue;
};
// In another file:
myType current;
// Iterate through a vector containing lots of myTypes
 // ... for ( i=0; i < myVecSize; i ++ )
    switch ( current.func )
    {
           case 1:
            //...
            break;
           // ........
           case 30:
             // blah
            break;
    }
Run Code Online (Sandbox Code Playgroud)

func每次都要通过开关.关于切换的好处还在于我的代码比30个函数更有条理.

或者我可以这样做(不太确定):

class myType
{
    myReturnType (*func)(int all, int of, int my, int args );
    string argv[123];
    int someOtherValue;
};
Run Code Online (Sandbox Code Playgroud)

我有30个不同的函数,在开始时,指向其中一个的指针被分配给myType.

  • 什么可能更快:切换语句或函数指针?

每秒呼叫:大约1000万.我不能只测试它 - 这需要我重写整个事情.目前使用开关.

我正在构建一个解释器,我希望它比Python和Ruby更快 - 每个时钟周期都很重要!

Mar*_*som 16

Switch语句通常使用跳转表来实现.我认为程序集可以归结为单个指令,这将使它非常快.

唯一可以肯定的方法是双向尝试.如果您无法修改现有代码,为什么不只是制作测试应用程序并在那里尝试?


Pét*_*rök 5

我认为在大多数情况下差异可以忽略不计 - 你的情况可能是一个例外.为什么不组合一个简单的原型应用程序来明确衡量每个解决方案的性能?我的猜测是,这不会超过一个小时的工作......

但是,请考虑代码的清晰度和可维护性.恕我直言,很明显,函数指针解决方案在这方面获胜.

更新:还要注意,即使一个解决方案,也就是说,它的速度是另一个解决方案的两倍,它仍然可能不一定能够重写您的代码.您应该首先分析您的应用程序,以确定在这些交换机中实际花费了多少执行时间.如果它是总时间的50%,则有理由对其进行优化.如果它仅为几个百分点,那么优化它将是浪费精力.