2012-10-12 23 views
1

我正在寫代碼,它從用戶處獲取一個數字,並以字符串的形式打印回來。我想知道,這是更好的性能明智的,有if語句,像if else語句和字符串長度之間的代碼性能

if (n < 100) { 
    // code for 2-digit numbers 
} else if (n < 1000) { 
    // code for 3-digit numbers 
} // etc.. 

或把數字符串,並獲得它的長度,然後它的工作作爲一個字符串。

該代碼是用C++編寫的。

+1

使用'boost :: lexical_cast'來處理這些容易出錯的任務。在測量之前,不要擔心這裏的表現。當它清楚地表明這會影響速度時,仍然是時候優化它們。 –

+0

這將會快得多,但這是編寫代碼的不好方法。如果你爲了更快的速度而拼命想着,你應該只考慮它。 – Jon

+0

或['std :: to_string'](http://en.cppreference.com/w/cpp/string/basic_string/to_string)。 –

回答

1

當然if-else會更快。

要比較兩個號碼,你只是比較它們逐位(也有不同的方法來做到這一點,但它是一個非常快速的操作)。

要獲得字符串的長度,您需要創建字符串,將數據放入並計算長度(也可以採用不同的方法,最簡單的方法是計算所有符號)。當然,它需要更多的時間。

在一個簡單的例子,雖然你不會注意到任何區別。人們常常會關注這樣的事情(無罪),這讓我感到驚訝。它不會有任何區別你,如果代碼將在0.003秒執行的0.001秒而不是真的...你應該讓這種低級別的優化你知道只有經過這個確切位置是你的應用的瓶頸,當你是當然,你可以提高一個體面的性能。

0

直到你衡量和這真的是一個瓶頸,不用擔心性能。

這就是說,下面應該是更快(爲便於閱讀,讓我們假設你使用的範圍介於0和99999999一型):

if (n < 10000) { 
    // code for less or equal to 4 digits 
    if (n < 100) 
    { 
     //code for less or equal to 2 digits 
     if (n < 10) 
      return 1; 
     else 
      return 2; 
    } 
    else 
    { 
     //code for over 2 digits, but under or equal to 4 
     if (n>=1000) 
      return 4; 
     else 
      return 3; 
    } 
} else { 
    //similar 
} // etc.. 

基本上,它是二進制搜索的變化。最差的情況下,這將需要O(log(n))而不是O(n) - n是最大位數。

+0

雖然複雜性更好,但今天人們通常會減少分支嵌套以幫助現代CPU進行預測。 –

0

string變種會慢一些:

std::stringstream ss;  // allocation, initialization ... 
ss << 4711;     // parsing, setting internal flags, ... 
std::string str = ss.str(); // allocations, array copies ...  

// cleaning up (compiler does it for you) ... 
str.~string(); 
ss.~stringstream();   // destruction ... 

...表明有更多的事情發生。

緊湊型(適合於高速緩存),循環(好分支預測),可能是你想要什麼:

int num_digits (int value, int base=10) { 
    int num = 0; 
    while (value) { 
     value /= base; 
     ++num; 
    } 
    return num; 
} 

int num_zeros (int value, int base=10) { 
    return num_decimal_digits(value, base) - 1; 
} 

根據具體情況,因爲它是高速緩存和預測的友好的,這可能是比基於解決方案快關係運營商。

的模板變形使編譯器爲你的部門做了一些微的優化:

template <int base=10> 
int num_digits (int value) { 
    int num = 0; 
    while (value) { 
     value /= base; 
     ++num; 
    } 
    return num; 
} 
0

的回答都不錯,但想一下,大約相對時間。

即使是你能想到的最慢的方法,程序可以做到這一點在第二的一些微小的部分,如可能100微秒。

平衡那些你能想象得到的最快的用戶,誰可能在500毫秒內輸入數字,誰能在接下來的任何事情之前再讀取500毫秒的輸出。

好的,機器在1000毫秒內基本上沒有任何功能,而在中間它必須像瘋狂一樣緊縮100微秒,因爲畢竟我們不希望用戶認爲程序太慢;-)