【问题标题】:C++ issues choosing a function at run timeC++ 在运行时选择函数的问题
【发布时间】:2011-01-21 11:20:04
【问题描述】:

我在 C++ 方面处于基础水平,所以如果我遗漏了一些明显的东西,请见谅。

我正在计划一个可以在两种模式下运行的程序。 它运行的模式将由程序第一次启动时读取的配置文件中的标志决定。 读取此配置文件后,程序将进入循环数百万次的循环。

在循环中的某一时刻,代码会根据配置文件中设置的模式执行不同的操作。

显然我可以使用 IF。如果模式 1 执行操作 1,否则如果模式 2 执行操作 2。 但我想节省 IF 所花费的时间(记住它会发生数百万次)。

为此,我考虑将 actions1 和 actions2 放在各自的函数中并使用函数指针。

然后我可以在循环之前读取配置文件时设置函数指针,并使用该指针代替 IF。

但是,问题是当放入函数时,actions1 和 actions2 有不同的参数,所以我需要两个函数指针来适应这意味着我又需要一个 IF。

我可以使用全局变量来解决这个问题,但我不想这样做。 任何人都可以提出解决此问题的方法吗?

或者我不应该担心数百万个 IF 的成本,编译器会看到做出的决定而不是一遍又一遍地做出决定吗?

编辑:感谢您的回答。 我用这个非常简单的代码做了一个测试:

int i = 2

int p = 10;

for(int f=0;f

{

如果(p == 10)
i = p+f;

}

当 if 存在时,它的运行速度实际上比我注释掉它时快 20%。 我想这一定是分支 hpredictor 在起作用,但我仍然不知道为什么它比不使用 if 时更快。

【问题讨论】:

  • 很遗憾,您的测试并不好。编译器可以完全优化掉条件,因为p == 10 的值在编译时是已知的。事实上,如果它真的很聪明,它可以完全优化循环(虽然我怀疑它在实践中这样做)。

标签: c++ function if-statement function-pointers


【解决方案1】:

在大多数现代处理器(例如 x86)上,都有一个“分支预测器”。处理器本身观察是否采用条件分支的模式;如果您总是做出相同的决定,那么它应该非常有效。

最好的办法就是简单地衡量。编写你的循环代码,首先没有任何条件(即只是硬编码它来执行动作#1),并测量运行例如需要多长时间。 1000 万次迭代。然后将if 语句放回原处,再次测量。在您确认它有所作为之前,没有必要担心!

【讨论】:

  • 我已经测试过了,它在使用 IF 的情况下运行速度实际上快了 20%,这是我没有预料到的。请参阅我对原始问题的编辑。感谢您的帮助。
  • 感谢知识。我将其更改为从命令行传入 P(以模拟我的最终代码)并且时间相同。我将使用 IF。谢谢。
【解决方案2】:

首先,这是过早的优化——CPU 的分支预测器非常擅长这种事情,我会更担心维护并使用继承而不是函数指针。其次,加快速度的唯一真正方法是预编译每个选项并在运行时将它们作为单独的库加载。

【讨论】:

    【解决方案3】:

    我在 C++ 方面处于基础水平,所以 如果我不见了,请原谅 很明显的东西。

    显而易见的解决方案似乎是将if 移出循环。而不是写:

    while (...)
    {
        if (flag)
        {
            // ...
        }
        else
        {
           // ...
        }
    }
    

    你可以写:

    if (flag)
    {
        while (...)
        {
            // ...
        }
    }
    else
    {
        while (...)
        {
            // ...
        }
    }
    

    【讨论】:

    • 是的,这可能更有效,但会导致源代码重复。如果可能的话,应该用模板来分解公共代码。
    • +1:这就是我在性能关键的地方所做的。 (当然有模板)。
    猜你喜欢
    • 2019-12-12
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多