C 如何优化以下代码?
我应该做什么来优化上面的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
我应该使用另一种编程语言来获得更好的结果吗?也许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;
}