2013-08-07 4 views
4

부스트 속성 트리를 사용하여 json 파일을로드/덤프합니다. 그러나 성능이 매우 나쁩니다.json 파일에서 부스트 속성 트리를 구성하는 것이 성능이 매우 나쁜가요?

예를 들어 크기가 1.8M 인 json 파일이 있습니다. boost C++ 프로그램은 json 파일을로드하고 특성 트리를 구성하는 데 3 초를 소비합니다. 파이썬을 사용하여 json 파일을로드하는 경우 0.1 초만 필요합니다. 그리고 파이썬은 모든 것을 객체로 만들 수도 있습니다.

는 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; 
} 

파이썬 스크립트와 같은 것입니다 :

#!/usr/bin//python 

import sys 
import json 

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

내가 최신 부스트 (1.54)을 시도했다. 이 작업을 수행하는 데는 여전히 속도가 느립니다.

조언이 있으면 감사드립니다.

해결 방법이 없다면 json을로드/덤프 할 다른 C++ 라이브러리를 알고 계십니까?

+0

C++ 프로그램을 어떻게 컴파일 했습니까? 최적화를 사용 했습니까? – filmor

+0

최적화가 컴파일 된 상태입니다. – limi

+0

C++ 프로그램이 대부분의 시간을 보내는 곳을 알기 위해 프로필을 만들었습니까? 'strace'처럼 단순한 것조차도 잠재적 인 병목 현상을 보여줄 수 있습니다. –

답변

0

JSON 파일에 실제로 무엇이 포함되는지는 중요하지 않습니다. 나는 다른 conent와 함께 여러 개의 JSON 파일을 시도했다. 부스트가 느립니다.

이제 jansson으로 전환했습니다. 더 빠르고 더 좋은 API입니다.

+0

부스트가 아닌 문제를 일으키는 것은 아마도'std :: string' 일 것입니다. – janm

1

릴리스 빌드와 VS 사이의 디버그 빌드 성능 번호가 속성 트리에 큰 차이가 있다는 것을 발견했습니다. 내 특정 하드웨어에서 read_json을 사용하여 1MB JSON 파일을 분석 할 때 디버그 빌드에서는 8 초가 걸렸지 만 릴리스 버전에서는 0.7 초 밖에 걸리지 않았습니다.

+0

위대한 팁! 나는 여기서 동일한 결과를 얻었고, 릴리스는 잘 수행되고, 다른 솔루션을 찾기 위해 나가지 못하게했다. – hyperspasm

1

우리는 boost :: property_tree 및 JSON과 관련하여 중대한 성능 문제가있었습니다. 우리의 접근 방식은 std::string을 사용하지 않고 사용자 정의 할당자를 가진 사내 문자열 클래스와 동일한 문자열을 두 번 재 할당하지 않기위한 해시 테이블을 사용했습니다. 대규모 JSON 파일의 경우 성능 및 메모리 사용량이 몇 배 이상 향상되었습니다.

JSON 파일은 크기가 커서 std :: string 할당이 32 비트 컴퓨터에서 사용 가능한 모든 주소 공간을 사용하기에 충분했습니다. 이 접근 방식으로 헤드 룸을 운영 할 수 있습니다.