2013-04-06 57 views
2

我已經使用POCO JSON編寫了一個簡單的分層json解析器,用作sax解析器。 如果我使用字符串或流作爲parse方法的輸入,請參閱下面的調用,或者是不同的構造方法是否等效,它們在結果中的差異是什麼?使用字符串或流解析的區別(Poco C++)

Parser parser; 
DefaultHandler handler; 
parser.setHandler(&handler); 
parser.parse(input); 

在內存消耗,速度等方面?

回答

5

std :: string版本只是一個代表您創建流的wrapper,所以最後總數將大致相同,字符串對用戶來說更方便。

[編輯]

這改變爲1.5.2 - 除去包裹,使得現在兩者(流和字符串)版本迭代。可以使用Benchmark Example來確定比串流慢多少。

[/編輯]

請注意,有一些breaking changes進來1.5.2 - 移除了DefaultHandler名稱和內部處理程序已經變成了自動創建智能指針(這是我們不得不廢棄的主要原因DefaultHandler所以現有的代碼不會將堆棧創建的處理程序傳遞給智能指針,但這不是一個好的設計)。所以,在1.5.2,明確處理程序的創建將不再需要爲默認解析:

std::string json = "{ \"test\" : null }"; 
Parser parser; 
Var result = parser.parse(json); 

如果您關心的性能,還要注意波科:: JSON解析器的速度,因爲目前的情況是,差我們將使用來自Poco::Web::JSONvery fast解析器或更快的東西(如果我們能夠找到/寫入它)。底線,1.5.x仍然是W.I.P.

希望這會有所幫助。

編輯:

Benchmarks在Windows和Mac(〜15MB JSON文件)

的Windows

波科:: JSON:1 195 313 [美]
波科: :Web :: JSON:403 320 [us]
json-parser:321 289 [us]
libjson:610 352 [us]

MAC(鐺)

波索:: JSON:480 965 [US]
波索::網絡:: JSON:176 297 [US]
JSON的解析器:220 172 [我們]

+0

它具有SAX解析器的特點? – 2013-06-12 19:53:41

+0

在1.5.2中,默認處理程序(ParseHandler)的行爲更像DOM(即將整個樹保留在內存中);最終用戶可以輕鬆地提供一個類似SAX的處理程序。 – Alex 2013-06-13 20:26:29