C 如何优化以下代码?

C 如何优化以下代码?,c,C,我应该做什么来优化上面的C程序,它必须被认为是有效的 我应该使用另一种编程语言来获得更好的结果吗?也许Java8,C++ + < /p> < p>优化代码的一种方法是让编译器为你做这项工作。 考虑同一函数的不同版本: int FindingMoves(int input1) { int result = 0; int input2 = input1 + 1; result = (2 * input2 + 1) * (2 * input2 + 1); return

我应该做什么来优化上面的C程序,它必须被认为是有效的


我应该使用另一种编程语言来获得更好的结果吗?也许Java8,C++ + < /p> < p>优化代码的一种方法是让编译器为你做这项工作。 考虑同一函数的不同版本:

int FindingMoves(int input1) {
    int result = 0;
    int input2 = input1 + 1;

    result = (2 * input2 + 1) * (2 * input2 + 1);
    return result;
}
在所有情况下,生成的部件都是相同的:

int Finding_Moves(int input)
{
    ++input;
    input *= 2;
    ++input;
    return input * input;
}

int Finding__Moves(int input1)
{
    int input2 = 2*(input1 + 1) + 1;
    return input2*input2;
}

int FindingMoves(int input1)
{
    int result = 0;
    int input2 = input1 + 1;

    result = (2*input2 + 1)*(2*input2 + 1);
    return result;
}

几乎不需要优化这段简单的代码,但遗憾的是:

    lea     eax, [rdi+3+rdi]
    imul    eax, eax
    ret

如果您对微优化感兴趣,可以使用

例如,
gcc-O2
clang-O2
将代码编译成两条指令:

int FindingMoves(int input1)
{
    int input2 = 2*(input1 + 1) + 1;
    return input2*input2;
}
您可以重写源代码以使其更具可读性,但现代编译器已经从中榨取了每一点性能

我个人会写:

FindingMoves(int):                      # @FindingMoves(int)
        lea     eax, [rdi + rdi + 3]
        imul    eax, eax
        ret
请注意,像这样优化一小段代码是不值得的,首先让完整的程序正确执行,并使用广泛的测试套件来验证这一点。然后改进您的代码,使其更可读、更安全、更可靠,并且经测试套件验证仍然完全正确

然后,如果测量的性能不令人满意,则使用基准数据编写性能测试,并使用探查器确定改进的领域


过早关注优化被称为过早优化,这种情况会在许多层面上造成挫折。

如果不借助assember,简单的优化就是

int FindingMoves(int input) {
    int x = 2 * (input + 1) + 1;
    return x * x;
}
两次乘法,一次加法,然后返回结果。而且它非常简单,任何高质量的编译器都可以很容易地生成有效的输出


在我尝试进一步优化之前,我希望看到来自测试用例和分析的重要证据。

它能做什么?它有用吗?是什么让您得出可以优化的结论?这个问题更适合于使用哪些优化标志?
int term=(输入1大多数编译器可以根据自己的标准来决定2的乘法是最好保持原样,转换为位移位,还是转换为加法。不需要人工进行这些转换。大多数普通人都可以简化基本代数表达式(例如,
2*(输入+1))+1到
2*输入+3
)正如我所做的那样,我倾向于使用可理解的代码。这个++输入怎么样?
++input;input如果我在原地使用位乘法++input,它会更优化一点吗?
++input
将导致另一个存储,即相当于
input=input+1;
,因此速度较慢。
输入
int FindingMoves(int input1)
{
    int term = 2*input1 + 3;
    return term*term;
}