Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从json文件构造boost属性树的性能非常差?_C++_Json_Boost_Boost Propertytree - Fatal编程技术网

C++ 从json文件构造boost属性树的性能非常差?

C++ 从json文件构造boost属性树的性能非常差?,c++,json,boost,boost-propertytree,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);

我正在使用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吗?< /P> < P> > JSON文件中真正的内容并不重要。我尝试了多个不同内容的JSON文件。推进速度很慢


现在我已经切换到jansson,这是一种更好的API,使用起来又快又好。

我发现发布版本与调试版本的性能数字与属性树的性能数字之间存在巨大差异。
在我的特定硬件上,使用read_JSON通过1 MB JSON文件进行解析在调试构建中需要8秒,但在发布版本中只需要0.7秒。

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


我们的JSON文件足够大,std::string分配占用了32位机器上所有可用的地址空间。这种方法让我们有了净空。< /P>你是如何编译C++程序的?你是否打开了优化?它是用优化编译的。你有没有看到C++程序大部分时间在哪里?即使是像
strace
这样简单的东西也可能显示出一些潜在的瓶颈。是的,我实际上有一个由collect生成的概要文件。但我还不太明白。您是否介意提供您试图解析的文件(或类似文件)?可能是
std::string
导致了您的问题,而不是boost。很棒的提示!我在这里也有同样的结果,发布版执行得很好,避免了我去寻找另一个解决方案。