2016-07-21 4 views
0

Mein Projekt hat eine Anforderung API ein Array (etwa 500 Elemente struct)Langsam json Serialisieren und Deserialisieren

ich versucht hat, zurückzukehren lib zu verwenden, wie fasthttp, easyjson, rapidjson (Anruf mit cgo), aber Ergebnis nicht gut genug.

Haben Sie eine bessere Empfehlung?

ist hier mein Code:

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"` 
} 

Testcode:

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

und Benchmark-Tests ergeben:

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

Da EasyJson die/MarshalJSON UnmarshalJSON Rewrite, so dass ich testen, mit der generierte Code zu unterschiedlichen Zeiten.

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

Wie auch immer, ffjson ist sehr ähnlich mit easyjson.

+0

Übrigens ist rapidjson langsam, weil cgo call viel Zeit kostet – Keto

+1

Ohne Code zu sehen, den Sie gerne verbessern würden, können wir Sie einfach auf ähnliche Fragen hinweisen: [Go JSON Decoding ist sehr langsam. Was wäre ein besserer Weg, es zu tun?] (Http://stackoverflow.com/questions/29282231/go-json-decoding-isvery-slow-what-would-bea-a-better-way-to-- TU es); und [JSON-Parsing in Go beschleunigen] (http://stackoverflow.com/questions/33222075/speeding-up-json-parsing-in-go) – icza

+0

Ich habe meinen Code an die Frage angehängt.mein ich bitte um Hilfe nochmal. – Keto

Antwort

0

Was meinen Sie mit "die Ergebnisse sind nicht gut genug"?

würde ich das die json Paket der Standardbibliothek verwenden:

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

Soweit ich sagen kann, ist es überall und ziemlich schnell und ressourcenschonend eingesetzt. Wenn das es nicht entweder geschnitten, möchten Sie vielleicht ffjson berücksichtigen:

https://github.com/pquerna/ffjson

Lassen Sie mich wissen, ob dies hilfreich war!

+0

thx für die antwort mich, schätze viel dafür, ffjson ist mir auch nicht zufrieden. – Keto

0

Bei der Verwendung von easyjson sollten Sie easyjson.Unmarshal() Funktion anstelle von json.Unmarshal() verwenden. Generierte benutzerdefinierte MarshalJSON()/UnmarshalJSON() sind nur ein kleiner Teil der Leistungsoptimierung (sie verwenden nicht reflect Paket). Der Hauptgewinn von easyjson erhalten Sie von optimierten easyjson.Unmarshal() und easyjson.Marshal(). Erstens macht JSON keine Vorvalidierung, was sehr langsam ist. Der zweite Modus verwendet die Nebenläufigkeit, um die Codierung zu verstärken.

Aus meiner Erfahrung easyjson steigert Unmarshaling bis zu 2 mal für kleine JSON oder JSON mit einfacher Struktur (z. B. Array von einfachen Objekten) und bis zu 4 mal für große oder/und tief geschachtelte JSON-Strukturen. Leider habe ich keine Statistiken für Marshalling.

+0

beim Kompilieren mit Generate-Code von easyjson, easyjson.Marshal() und easyjson.Unmarshal() sind nur ein Wrapper von MarshalEasyJSON()/UnmarshalEasyJSON(), ich habe es nach deiner Empfehlung versucht, aber es machte keinen Unterschied. – Keto

+0

Mein Test hat die Leistung von etwa 2 mal schneller erreicht als go-json.Aber wenn Marshal/Unmarshal große Array, wird es zum wreose. – Keto

+0

Ja, du hast Recht, Entschuldigung. Ihre Tests sind korrekt. Wie auch immer, x2 Performance-Boost ist nicht so schlecht. Alle anderen alternativen Bibliotheken sind nicht besser, aber easyjson ist am einfachsten zu benutzen. – Barberry

Verwandte Themen