2016-07-21 2 views
0

내 프로젝트는 배열을 반환하는 요구 사항 API 내가 fasthttp 같은 lib 디렉토리를 사용하는 것을 시도했다느린 JSON 마샬링과 비 정렬 화

(약 500 요소 구조체), easyjson, rapidjson (cgo 콜)을 가지고 있지만, 결과는 아니다 충분하다.

너희들에게 더 좋은 추천이 있니? 여기

내 코드입니다 :

type Line struct { 
    Time string `json:"time" bson:"time"` 
    Open float64 `json:"open" bson:"open"` 
    Close float64 `json:"close" bson:"close"` 
    High float64 `json:"high" bson:"high"` 
    Low float64 `json:"low" bson:"low"` 
    Volume float64 `json:"volume" bson:"volume"` 
    Amount float64 `json:"amount" bson:"amount"` 
} 

type MultiLines struct { 
    AllLines []Line `json:"lines"` 
} 

시험 코드 :

func BenchmarkJson500(b *testing.B) { 
    for i := 0; i < b.N; i++ { 
     _, err := json.Marshal(&sliceData) 
     if err != nil { 
      panic(err) 
     } 
    } 
} 

func BenchmarkUnmarshalJson500(b *testing.B) { 
    lines := make([]Line, 500) 
    for i := 0; i < b.N; i++ { 
     err := json.Unmarshal(sliceJson, &MultiLines{lines}) 
     if err != nil { 
      panic(err) 
     } 
    } 
} 

func BenchmarkEasyJson500(b *testing.B) { 
    for i := 0; i < b.N; i++ { 
     _, err := sliceData.MarshalJSON() 
     if err != nil { 
      panic(err) 
     } 
    } 
} 

func BenchmarkEasyUnmarshalJson500(b *testing.B) { 
    for i := 0; i < b.N; i++ { 
     slice := MultiLines{} 
     err := slice.UnmarshalJSON(sliceJson) 
     if err != nil { 
      panic(err) 
     } 
    } 
} 

그리고 벤치 마크 테스트 결과 : EasyJson가 UnmarshalJSON/MarshalJSON를 다시 작성하기 때문에

BenchmarkUnmarshalJson500-4   500   2821450 ns/op 
BenchmarkJson500-4     500   2151984 ns/op 

, 그래서 난과 테스트 다른 시간에 생성 된 코드.

BenchmarkEasyJson500-4    1000   1434724 ns/op 
BenchmarkEasyUnmarshalJson500-4  1000   1276298 ns/op 

어쨌든 ffjson은 easyjson과 매우 유사합니다.

+0

단, cgo 호출 비용이 많이 들기 때문에 rapidjson이 느립니다. – Keto

+1

개선하려는 코드가 없어도 비슷한 질문을 할 수 있습니다. [JSON 디코딩이 매우 느립니다. 무엇이 더 좋은 방법이 될 것이라고?] (http://stackoverflow.com/questions/29282231/go-json-decoding-is-very-slow-what-would-be-a-better-way-to- 해); 및 [JSON 구문 분석 속도 향상] (http://stackoverflow.com/questions/33222075/speeding-up-json-parsing-in-go) – icza

+0

질문에 내 코드를 추가했습니다. 도움을 요청합니다. 다시. – Keto

답변

0

"결과가 충분하지 않다"는 것은 무엇을 의미합니까?

나는 표준 라이브러리의 json으로 패키지를 사용하십시오 :

https://golang.org/pkg/encoding/json/

를 지금까지 내가, 그것은 어디서나 사용 매우 신속하고 자원 친화적 말할 수 있습니다. 그 중 하나를 절단하지 않는 경우, ffjson을 고려하는 것이 좋습니다 :이 helpfull 인 경우

https://github.com/pquerna/ffjson

은 알려주세요!

+0

답장을 보내 주셔서 감사합니다. ffjson도 만족스럽지 않습니다. – Keto

0

easyjson을 사용하는 동안 json.Unmarshal() 대신 easyjson.Unmarshal() 함수를 사용해야합니다. 생성 된 사용자 지정 MarshalJSON()/UnmarshalJSON()은 성능 최적화의 일부에 지나지 않으며 패키지는 reflect 패키지를 사용하지 않습니다. 주요 이익은 easyjson에서 easyjson.Unmarshal()easyjson.Marshal()으로 최적화됩니다. 첫 번째는 JSON 사전 확인을 매우 느리게 만들지 않습니다. 두 번째는 동시성을 사용하여 인코딩을 향상시킵니다.

내 경험에 의하면 easyjson은 단순한 구조 (예 : 간단한 개체 배열)의 작은 JSON 또는 JSON에 대해 최대 2 배의 언 마샬링을 제공하며 크고 깊숙이 중첩 된 JSON 구조에 대해서는 최대 4 배의 마샬링을 향상시킵니다. 불행히도 마샬링에 대한 통계가 없습니다.

+0

easyjson, easyjson.Marshal() 및 easyjson의 생성 코드로 컴파일 할 때.Unmarshal()은 MarshalEasyJSON()/UnmarshalEasyJSON()의 래퍼입니다. 귀하의 추천에 따라 시도했지만, 어떤 차이도 없습니다. – Keto

+0

내 테스트는 go-json보다 약 2 배 빠른 성능을 나타냅니다.하지만 마샬링/언 마샬 할 때 큰 배열이 생성됩니다. – Keto

+0

예, 맞았습니다, 죄송합니다. 테스트가 정확합니다. 어쨌든, x2 성능 향상은 그렇게 나쁘지 않습니다. 다른 모든 대체 라이브러리는 좋지 않지만 easyjson은 사용하기가 쉽습니다. – Barberry