JsonCpp使用優化

2021-06-17 16:01:43 字數 1360 閱讀 4175

最近乙個專案在使用jsoncpp,jsoncpp簡潔易用的介面讓人印象深刻。但是在實際使用過程中,我發現jsoncpp的效能卻不盡如人意,所以想著方法優化下效能。

**理解

1、jsoncpp中一切都是value,value用union指向自己儲存的資料。value的型別分為兩種,一種是容器型別,比如arrayvalue和objectvalue。二者都是用map儲存資料,只是arrayvalue的key為數字而已。另外一種是基本型別,比如字串,整型數字等等。 www.2cto.com

2、解釋json資料時,jsoncpp在operator函式開銷比較大。jsoncpp內部使用std::map,map在查詢效能上不如hash_map,但是將map替換成hash_map有一定的困難,因為map的key為czstring,而這個類又是value的內部類,導致不能定義hash_map需要的hash結構體。

本來想嘗試下internal map,結果開啟json_value_use_internal_map這個巨集之後,根本通不過編譯,因為value.h中有一處uion宣告裡面居然放的是結構體,不知道什麼編譯器支援這種語法。

基準測試程式

#include

#include

#include

#include

#include

using namespace std;

int64_t getcurrenttime()

char * str = "abcdefghijklmnopqrstuvwxyz";

void test1()

int main(int argc, const char *argv)

編譯優化

預設情況下,jsoncpp編譯時並沒有帶優化引數,自己可以加上優化引數。linux環境下在下面這段**中的ccflags加入」o2″。

測試**中第三種方法比第一種方法效率提公升了一倍多。第三種方法之所以效率更高,有兩個原因。

1、首先是在迴圈中一直復用auc_info物件。第乙個迴圈就能將auc_info的長度初始化為doc_count。通過下標的訪問方法,一直復用陣列中的元素。

2、如果key和value記憶體不會被釋放,那麼使用staticstring效率會更高,省去了構造czstring時拷貝的開銷。

**優化

因為在jsoncpp中一切都是value,所以會有大量的隱性型別轉換,要構造大量的value物件。為了提高效能,可以在實現繞過這個機制,犧牲一致性。

因為value最常用的型別是字串,因此給value增加乙個setvalue函式。

void

value::setvalue( const staticstring& value )

再測試一下效能,可以發現效能較第三種方法還有提公升。

jsoncpp使用示例

下面的示例程式顯示了jsoncpp的初步使用方法,包括了自定義物件的序列化等操作。include json json.h include using namespace std struct data可序列化物件 void deserialize json value root int main i...

JsonCpp使用簡介

json 名稱 值對 例如 firstname john json 物件在花括號中書寫,例如 json 陣列,陣列可包含多個物件 jsoncpp json value 是jsoncpp 中最基本 最重要的類,用於表示各種型別的物件,json reader 用來將記憶體或檔案中的json資料轉換成js...

jsoncpp 使用詳解

jsoncpp 主要包含三種型別的 class value reader writer。jsoncpp 中所有物件 類名都在 namespace json 中,包含 json.h 即可。json value 只能處理 ansi 型別的字串,如果 c 程式是用 unicode 編碼的,最好加乙個 ad...