int FindingMoves(int input1) {
int result = 0;
int input2 = input1 + 1;
result = (2 * input2 + 1) * (2 * input2 + 1);
return result;
}
我该怎么做才能优化上面的C程序,必须考虑为高效?我能做些什么来优化以下代码?
我应该使用另一种编程语言来获得更好的结果吗上面的程序可能是Java8,C++?
int FindingMoves(int input1) {
int result = 0;
int input2 = input1 + 1;
result = (2 * input2 + 1) * (2 * input2 + 1);
return result;
}
我该怎么做才能优化上面的C程序,必须考虑为高效?我能做些什么来优化以下代码?
我应该使用另一种编程语言来获得更好的结果吗上面的程序可能是Java8,C++?
优化代码的一种方法是让编译器为您完成这项工作。
考虑不同版本的同一功能:
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
哪个优化标志在哪里使用? – sg7
很少需要优化这个简单的代码,但唉:
int FindingMoves(int input1)
{
int input2 = 2*(input1 + 1) + 1;
return input2*input2;
}
如果我使用按位乘法就地++输入,它会进行更多的优化;输入<< = 1; ++输入;返回输入*输入;喜欢这个。 –
@Mickey Jack,'++ input'将导致另一个存储,即相当于'input = input + 1;',因此速度较慢。 'input << = 1;'相同。左移而不是与2相乘可能会更快。 –
如果你有兴趣在微优化,你可以用Godbolt's fantastic Compiler Explorer
例如同时播放gcc -O2
和clang -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;
}
注意,优化一小块这样的代码是不值得的,首先获得完整的程序正确执行和使用广泛的测试套件来验证。然后改进您的代码,使其更具可读性,更安全,更可靠,并且仍然完全正确,正如测试套件所证实的那样。
然后,如果测量的性能不理想,请使用基准数据编写性能测试,并使用分析器来确定改进的方面。
过早集中优化称为过早优化,这种情况会导致许多级别的挫败感。
这个++输入怎么样;输入<< = 1; ++输入;返回输入*输入; –
'++ input;输入<< = 1; ++输入;返回输入*输入; '编译成相同的代码,但它的可读性较差,并且对'输入'的负值具有未定义的行为。作为一个经验法则,优化具有副作用的表达式会更复杂。在单独的变量中计算中间值实际上提高了可读性和代码生成。 – chqrlie
没有求助于装配台,简单的优化是
int FindingMoves(int input1)
{
int term = 2*input1 + 3;
return term*term;
}
两个乘法,一个加法,然后返回结果。很简单,任何体面的质量编译器都可以很容易地生成有效的输出。
我希望看到来自测试用例和性能分析的重要证据,然后再尝试进一步优化。
它是做什么的?它工作吗?是什么让你得出可以优化的结论? –
这个问题更适合[代码评论](http://codereview.stackexchange.com/) –
[“过早优化是万恶之源”](http://wiki.c2.com/?PrematureOptimization) – pmg