从 json 文件构造 boost 属性树的性能很差?

Posted

技术标签:

【中文标题】从 json 文件构造 boost 属性树的性能很差?【英文标题】:performance is very bad to construct boost property tree from json file? 【发布时间】:2013-08-07 08:22:43 【问题描述】:

我正在使用 boost 属性树来加载/转储 json 文件。但是,性能很差。

例如,我有一个大小为 1.8M 的 json 文件。 boost C++程序花费3秒加载json文件并构建属性树。如果我使用 python 加载 json 文件,它只需要 0.1 秒。而且python也会把所有东西都构造成对象。

C++程序是这样的:

int main(int argc, char **argv)
        std::fstream fin;
        fin.open(argv[1], std::fstream::in);
        if (!fin.is_open())
            ASSERT(false);
        

        boost::property_tree::ptree pt;
        try
            read_json(fin, pt);
        catch(ptree_error & e) 
            ASSERT(false);
        
        fin.close();

    return 0;

做同样事情的python脚本是这样的:

#!/usr/bin//python

import sys
import json

fp = open(sys.argv[1],"r")
objs = json.load(fp)

我尝试了最新的提升 (1.54)。这样做仍然很慢。

感谢任何建议。

如果没有解决方案,你知道任何其他 C++ 库来加载/转储 json 吗?

【问题讨论】:

你是如何编译你的 C++ 程序的?你开启优化了吗? 编译时优化了。 你有没有分析过 C++ 程序大部分时间花在哪里?即使像strace 这样简单的事情也可能会显示出一些潜在的瓶颈。 是的,我实际上有一个由 collect 生成的配置文件。但我还不是很明白。 dl.dropboxusercontent.com/u/623030/boost_json.collect.incl.txt 您介意提供您要解析的文件(或类似文件)吗? 【参考方案1】:

我们在 boost::property_tree 和 JSON 方面遇到了严重的性能问题。我们的方法是停止使用std::string,并使用带有自定义分配器的内部字符串类,以及不重新分配相同字符串两次的哈希表。这将大型 JSON 文件的性能和内存使用率提高了至少几个数量级。

我们的 JSON 文件足够大,以至于 std::string 分配占用了 32 位机器上的所有可用地址空间。这种方法让我们有足够的空间运行。

【讨论】:

【参考方案2】:

我发现 VS for Property Tree 的 Release Build 与 Debug Build 性能数字之间存在巨大差异。 在我的特定硬件上,使用 read_json 解析 1 MB JSON 文件在 Debug build 中需要 8 秒,但在发布版本中只需要 0.7 秒。

【讨论】:

很棒的提示!我在这里得到了相同的结果,发布执行得很好,让我不用去寻找另一个解决方案。【参考方案3】:

JSON 文件中的真正内容并不重要。我尝试了多个具有不同内容的 JSON 文件。 Boost 很慢。

现在我已经切换到 jansson,它要好得多 - 可以使用快速又好用的 API。

【讨论】:

可能是std::string 导致了您的问题,而不是提升。

以上是关于从 json 文件构造 boost 属性树的性能很差?的主要内容,如果未能解决你的问题,请参考以下文章

通过使用 boost 属性树解析 JSON 文件来访问布尔值

提升属性树性能

从 .* 的构造函数抛出的 boost 正则表达式异常

使用Boost JSON解析器的JSON格式错误

返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有啥区别?

从 boost 序列化档案中构造对象