2011-04-04 96 views
13

我的目標是找到用於將int轉換爲字符串(反之亦然)和解析的最快C++庫。高性能低延遲C++自定義字符串類

任何已經對C++性能進行過實驗的人都會很快意識到,與說STL int算術運算相比,STL的字符串類具有可怕的性能。

一些樣品基準從我的3.3 GHz英特爾,GCC,CentOS 5.5機:

memcpy  0.004000 microsec/op 
atoi   0.025000 microsec/op 
atof   0.133000 microsec/op 
strtod  0.133000 microsec/op 
atof   0.135108 microsec/op 
(char) uchar 0.001801 microsec/op 
(char) ushort 0.001801 microsec/op 
cache accs 0.010505 microsec/op 
maplookup  0.128534 microsec/op 
add_int  0.002456 microsec/op 

您可以快速查看該字符串操作將成爲任何高速通訊應用的瓶頸。

我已經找到了高性能字符串(列出)的其他庫,但我希望有人有類似的困難,並已達到一些解決方案,可能包括編寫自己的字符串類。

+3

嗯,你已經做了基準。但我的問題是:優化這門課真的很重要嗎?在實際字符串<->數字轉換中花費了大量時間(> 20%)?而且,爲什麼麻煩把數字數據作爲字符串發送?將它們以原生(或中間,但仍然是數字)表示方式發送將會更有效率 – 2011-04-04 16:55:48

+5

您是否有一個應用程序,您已經對其進行了配置並確定了瓶頸處理字符串,或者您只是猜測它可能是在一些假設的應用程序中是瓶頸? – 2011-04-04 16:57:08

+6

我想你會發現這不是一個真正的瓶頸。網絡延遲將使這些時間中的任何一個時間模糊幾個數量級。 – 2011-04-04 16:57:36

回答

5

您沒有提供太多有關您的服務器,但看看AMD和英特爾的這些庫:

AMD String Library

Intel Integrated Performance Primitives

都使用SSE extensions加快字符串操作。

據我所知,他們沒有atoi(),但您可以使用庫來定位輸入中的小數。鑑於字符串的位置和長度,使用SSE內在函數編寫轉換應該是微不足道的。

0

我寫了我自己的字符串類(gstring)。它只是頭文件,允許我重用堆棧緩衝區並輕鬆地包裝C字符串。包含整數編碼。整數解碼是strtol的一個包裝。

可以讓我輕鬆地分析字符串:

uint32_t pos = 0 
gstring gs1 = gstr.netstringAt (pos, &pos); // gs1 is a *view* into gstr 
gstring gs2 = gstr.netstringAt (pos, &pos); 
int int1 = gstr.intAt (pos, &pos); if (gstr[pos] == ',') ++pos; 
int int2 = gstr.intAt (pos, &pos); if (gstr[pos] == ',') ++pos; 

還有Str,但其在64位平臺上的行爲對我來說並不很清楚。還有FBString。他們promise,「愚蠢::到」轉換很快。

0

以ASCII十六進制格式發送所有內容,然後用匯編語言編寫轉換例程。

0

Boost Karma庫的作者做了幾個整數到字符串轉換方法here的比較。在this post我做了類似的比較,但包括format library。您不需要自定義字符串類,例如,在格式庫的情況下,輸出存儲在內部緩衝區中,您可以將其轉換爲std::string或以C字符串或字符數組的形式訪問如有必要,您可以避免字符串創建。

0
int castString(const char * str) 
{ 
    int val = 0; 
    while(*str) { 
     val = val*10 + (*str++ - '0'); 
    } 
    return val; 
} 

這是非常快的

+2

完全沒有任何錯誤檢查!你是多麼信任的靈魂。這也不處理簽名輸入,所以它可能應該返回unsigned int。 – Speed8ump 2015-03-13 00:15:36