6

我正在使用 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)。这样做仍然很慢。

感谢任何建议。

如果没有解决方案,您是否知道任何其他用于加载/转储 json 的 C++ 库?

4

3 回答 3

3

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

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

于 2015-06-12T08:05:44.627 回答
1

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

于 2015-06-12T07:57:07.803 回答
0

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

现在我已经切换到 jansson,它要好得多——使用起来既快又好用的 API。

于 2014-01-17T04:38:21.173 回答