2016-07-21 10 views
0

私のプロジェクトでは、配列を返すように要求API私はfasthttpようLIBを使用しようとしましたスローJSONマーシャリングとマーシャリング解除

(約500要素構造体)、easyjsonrapidjsoncgoを呼び出す)を持っているが、結果ではありません十分に良い。

あなたのお勧めはありますか?ここで

は私のコードです:

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) 
     } 
    } 
} 

そして、ベンチマークテストは、結果:

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

EasyJsonがUnmarshalJSON/MarshalJSONを書き換えので、私はテストしているので生成されたコードは別の時間に

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

とにかく、ffjsonはeasyjsonと非常によく似ています。

+0

ところで、cgo呼び出しには多くの時間がかかるので、slowjsonは遅くなります – Keto

+1

改善したいコードはありませんが、同様の質問が表示されます:[JSONのデコードは非常に遅いです。それを行うより良い方法は何でしょうか?](http://stackoverflow.com/questions/29282231/go-json-decoding-is-very-slow-what-would-be-a-better-way-to- do-it); [GoでのJSON解析のスピードアップ](http://stackoverflow.com/questions/33222075/speeding-up-json-parsing-in-go) – icza

+0

質問に私のコードを追加しました。私はあなたに助けを求める再び。 – Keto

答えて

0

「結果は十分ではありません」とはどういう意味ですか?

私は標準ライブラリのJSONパッケージを使用したい:

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

私の知る限り、それはどこでも使われていると非常に高速と資源に優しいの。それはどちらかそれをカットしていない場合は、ffjsonを検討する必要があります:

https://github.com/pquerna/ffjson

が、これが参考になったなら、私を知ってみましょう!

+0

私は答えてくれてありがとう、ffjsonはどちらも満足していません。 – Keto

0

easyjsonを使用しているときは、json.Unmarshal()の代わりにeasyjson.Unmarshal()関数を使用する必要があります。生成されたカスタムMarshalJSON()/UnmarshalJSON()は、パフォーマンス最適化のほんの一部です(reflectパッケージは使用しません)。主な利益はeasyjsonからeasyjson.Unmarshal()easyjson.Marshal()に最適化されています。最初のものはJSONの事前検証を非常に遅くしません。 2つ目は並行処理を使用してエンコードをブーストします。

私の経験から、シンプルな構造(たとえば単純なオブジェクトの配列)のJSONまたはJSONの場合は最大2倍、大きな/または深いネストのJSON構造の場合は最大4倍の非整列性が強化されます。残念ながら、私はマーシャリングのための統計を持っていません。

+0

easyjson、easyjson.Marshal()とeasyjsonの生成コードでコンパイルすると、Unmarshal()はMarshalEasyJSON()/ UnmarshalEasyJSON()のラッパーにすぎませんが、私はあなたの推薦に従って試してみましたが、何の違いもありません。 – Keto

+0

私のテストはgo-jsonより約2倍高速です。しかし、マーシャリング/アンマーシャリングの大規模な配列は、wroseになります。 – Keto

+0

はい、そうです、申し訳ありません。あなたのテストは正しいです。とにかく、x2パフォーマンスの向上はそれほど悪くはありません。他のすべての代替ライブラリは良くありませんが、easyjsonは使いやすいです。 – Barberry

関連する問題