2014-01-15 27 views
-3

以下兩個代碼之間的更快速度是什麼?爲什麼? 在這種情況下,一個可以比另一個更受歡迎?轉換運算符快還是不快?

double x = (a + b) >> 1 
double x = (a + b)/2.0 
+1

無法分辨沒有上下文。另外,不要擔心這種「效率」或者什麼 - 除非進行基準測試,這是過早的優化。 – 2014-01-15 18:09:35

+0

取決於平臺。證明你需要關心自己的速度是多快,並且證明這種轉變是代碼中的瓶頸。否則你只是在浪費你的時間。 –

+3

如果將2.0替換爲2 - 所以片段實際上具有相同的結果 - 任何現代編譯器都會將慢速片段轉換爲快速片段。選擇一個表達你的意圖*,位移或分裂的人。 – molbdnilo

回答

0

正如其他人所說,這兩種說法會產生不同的結果,特別是如果(a + b)是一個奇數值。

此外,根據語言,ab必須是整數值以滿足移位操作。

如果ab在兩個語句之間的類型不同,那麼您正在比較蘋果和大象。

鑑於這種演示程序:

#include <iostream> 
#include <cstdlib> 
#include <cmath> 

using std::cout; 
using std::endl; 

int main(void) 
{ 
    const unsigned int a = 5; 
    const unsigned int b = 8; 

    double x = (a + b) >> 1; 
    cout << x << endl; 
    double y = (a + b)/2.0; 
    cout << y << endl; 

    return EXIT_SUCCESS; 
} 

輸出:
6.5

基於此實驗中,比較是蘋果和桔子。涉及移位的聲明是除以浮點數的不同操作。

就速度而言,第二種說法較慢,因爲在應用除法之前必須將表達式(a + b)轉換爲double。該部門是浮點,在沒有硬件浮點支持的平臺上可能會很慢。

你不應該關心任何語句的執行速度。更重要的是該計劃的正確性和健壯性。例如,上面的兩個陳述提供了不同的結果,這是正確性的一個非常重要的關注。

大多數用戶會等待程序產生正確的結果,而不是產生錯誤結果或行爲的快速程序(沒有人急於讓程序崩潰)。

管理層寧願花時間完成程序,而不是浪費時間優化很少執行的程序部分。

6

這些做不同的事情,所以選擇你喜歡的功能之一:截斷結果或返回0.5分數。

3

「不成熟的優化是萬惡之源」。使用什麼更具可讀性,當你遇到性能問題時,首先查找算法和數據結構,在那裏你可以獲得最大的性能增益,然後運行分析器並優化必要的位置。

+1

更不用說在這種情況下,如果「a + b」是奇數,結果將會根本不同。 –

0

如果ab是double或float,則移位會產生不正確的結果。

+2

如果'a'或'b'是一個浮點值,代碼將不會被編譯。如果'a + b'是奇數,那麼移動或除以2.0會產生顯着不同的結果。 –