从json文件构造boost属性树的性能非常糟糕?

时间:2013-08-07 08:22:44

标签: c++ json boost boost-propertytree

我正在使用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吗?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

JSON文件中真正的内容并不重要。我尝试了多个不同的conent JSON文件。提升很慢。

现在我已经切换到更好的jansson - 快速且好用的API。