我该怎么做才能优化以下代码?

时间:2017-07-15 11:57:58

标签: c

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

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

如何优化上述C程序,必须将其视为高效

我是否应该使用其他编程语言来获得更好的结果,以上程序可能是Java8,C ++?

4 个答案:

答案 0 :(得分:6)

优化代码的一种方法是让编译器为您完成工作。

考虑相同功能的不同版本:

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

HERE

答案 1 :(得分:1)

很少需要优化这个简单的代码,但唉:

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

答案 2 :(得分:1)

如果您对微优化感兴趣,可以使用Godbolt's fantastic Compiler Explorer

例如,gcc -O2clang -O2将您的代码编译为2条指令:

FindingMoves(int):                      # @FindingMoves(int)
        lea     eax, [rdi + rdi + 3]
        imul    eax, eax
        ret

您可以重写源代码以使其更具可读性,但现代编译器已经从中榨取了所有性能。

我个人会写:

int FindingMoves(int input) {
    int x = 2 * (input + 1) + 1;
    return x * x;
}

请注意,优化这样的一小段代码是不值得的,首先要使整个程序正确执行并使用广泛的测试套件来验证。然后改进您的代码,使其更具可读性,更安全,更可靠,并且在测试套件验证后仍然完全正确。

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

过早关注优化被称为过早优化,这种情况会导致许多层面的挫败感。

答案 3 :(得分:1)

不依靠声明,简单的优化就是

int FindingMoves(int input1)
{
    int term = 2*input1 + 3;
    return term*term;
}

两次乘法,一次加法,然后返回结果。而且很简单,任何体面的质量编译器都可以很容易地产生有效的输出。

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