私のプロジェクトでは、配列を返すように要求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)
}
}
}
そして、ベンチマークテストは、結果:
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と非常によく似ています。
ところで、cgo呼び出しには多くの時間がかかるので、slowjsonは遅くなります – Keto
改善したいコードはありませんが、同様の質問が表示されます:[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
質問に私のコードを追加しました。私はあなたに助けを求める再び。 – Keto