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