2017-07-15 86 views
-5
int FindingMoves(int input1) { 
    int result = 0; 
    int input2 = input1 + 1; 

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

我该怎么做才能优化上面的C程序,必须考虑为高效我能做些什么来优化以下代码?

我应该使用另一种编程语言来获得更好的结果吗上面的程序可能是Java8,C++?

+1

它是做什么的?它工作吗?是什么让你得出可以优化的结论? –

+4

这个问题更适合[代码评论](http://codereview.stackexchange.com/) –

+0

[“过早优化是万恶之源”](http://wiki.c2.com/?PrematureOptimization) – pmg

回答

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

+0

哪个优化标志在哪里使用? – sg7

1

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

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

如果我使用按位乘法就地++输入,它会进行更多的优化;输入<< = 1; ++输入;返回输入*输入;喜欢这个。 –

+0

@Mickey Jack,'++ input'将导致另一个存储,即相当于'input = input + 1;',因此速度较慢。 'input << = 1;'相同。左移而不是与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; 
} 

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

然后,如果测量的性能不理想,请使用基准数据编写性能测试,并使用分析器来确定改进的方面。

过早集中优化称为过早优化,这种情况会导致许多级别的挫败感。

+0

这个++输入怎么样;输入<< = 1; ++输入;返回输入*输入; –

+0

'++ input;输入<< = 1; ++输入;返回输入*输入; '编译成相同的代码,但它的可读性较差,并且对'输入'的负值具有未定义的行为。作为一个经验法则,优化具有副作用的表达式会更复杂。在单独的变量中计算中间值实际上提高了可读性和代码生成。 – chqrlie

1

没有求助于装配台,简单的优化是

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

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

我希望看到来自测试用例和性能分析的重要证据,然后再尝试进一步优化。

+0

'int term =(input1 << 1)+ 3;'会更微量优化。 'int term = input1 + input1 + 3;'也会稍微好一点,2个加法和1个乘法。 – mch

+0

大多数编译器可以根据自己的标准来决定是否更好地保留乘以2,转换为位移或转换为加法。没有必要为人类做这些转变。可以肯定的是,大多数凡人都可以简化基本的代数表达式(例如'2 *(input + 1)+ 1'到'2 * input + 3'),我倾向于理解代码。 – Peter

相关问题