int FindingMoves(int input1) {
int result = 0;
int input2 = input1 + 1;
result = (2 * input2 + 1) * (2 * input2 + 1);
return result;
}
如何优化上述C程序,必须将其视为高效?
我是否应该使用其他编程语言来获得更好的结果,以上程序可能是Java8,C ++?
答案 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
答案 1 :(得分:1)
很少需要优化这个简单的代码,但唉:
int FindingMoves(int input1)
{
int input2 = 2*(input1 + 1) + 1;
return input2*input2;
}
答案 2 :(得分:1)
如果您对微优化感兴趣,可以使用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;
}
请注意,优化这样的一小段代码是不值得的,首先要使整个程序正确执行并使用广泛的测试套件来验证。然后改进您的代码,使其更具可读性,更安全,更可靠,并且在测试套件验证后仍然完全正确。
然后,如果测量的性能不令人满意,请使用基准数据编写性能测试,并使用分析器确定改进的领域。
过早关注优化被称为过早优化,这种情况会导致许多层面的挫败感。
答案 3 :(得分:1)
不依靠声明,简单的优化就是
int FindingMoves(int input1)
{
int term = 2*input1 + 3;
return term*term;
}
两次乘法,一次加法,然后返回结果。而且很简单,任何体面的质量编译器都可以很容易地产生有效的输出。
在我尝试进一步优化之前,我希望从测试用例和分析中看到重要的证据。