2017-07-15 89 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

相關問題