【问题标题】:The difference between parsing using a string or a stream (Poco c++)使用字符串和流解析的区别(Poco c++)
【发布时间】:2013-04-06 14:02:41
【问题描述】:

我使用 POCO JSON 编写了一个简单的分层 json 解析器,用作 sax 解析器。 如果我使用字符串或流作为 parse 方法的输入,它们的结果有什么不同吗?请参阅下面的调用,或者不同的构造函数是否等效?

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

在内存消耗、速度等方面?

【问题讨论】:

    标签: json saxparser poco-libraries


    【解决方案1】:

    std::string 版本只是一个 wrapper 代表您创建流,所以最后总数将大致相同,字符串对用户来说更方便。

    [编辑]

    这在 1.5.2 中已更改 - 删除了包装,因此现在(流和字符串)版本都可以迭代。 Benchmark Example 可用于确定流比字符串慢多少。

    [/编辑]

    请注意在 1.5.2 中有一些 breaking changes - DefaultHandler 名称已被删除,内部处理程序已变成自动创建的智能指针(这是我们必须废弃 DefaultHandler 以使现有代码无法通过的主要原因堆栈创建的智能指针处理程序,这不是一个好的设计)。因此,在 1.5.2 中,默认解析不再需要显式创建处理程序:

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

    如果您关心性能,还要注意 Poco::JSON 解析器的速度,就目前而言,很差,我们将使用来自 Poco::Web::JSONvery fast 解析器或更快的解析器(如果我们能找到/写下来)。最重要的是,1.5.x 仍然是 W.I.P.

    希望这会有所帮助。

    编辑:

    Benchmarks 在 Windows 和 Mac 上(~15MB JSON 文件):

    Windows

    Poco::JSON: 1 195 313 [我们]
    Poco::Web::JSON: 403 320 [我们]
    json 解析器:321 289 [我们]
    libjson: 610 352 [我们]

    MAC (clang)

    Poco::JSON: 480 965 [我们]
    Poco::Web::JSON: 176 297 [我们]
    json 解析器:220 172 [我们]

    【讨论】:

    • 并且具有SAX-parser的特性?
    • 在 1.5.2 中,默认处理程序 (ParseHandler) 的行为更像 DOM(即将整个树保留在内存中);最终用户可以轻松地为处理程序提供类似 SAX 的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多