Das effizienteste Kabelformat für GHCJS-Code über Websockets

8

Ich arbeite an einer Haskell-Anwendung, die in dem mit GHCJS kompilierten Browser läuft, der mit einem ebenfalls in Haskell geschriebenen Server über Websockets kommuniziert. Beide Programme teilen die gleiche Haskell-Datentypdefinition und ich muss "nur" das Serialisierungsformat auswählen.

Im Moment läuft das Programm der Einfachheit halber auf Read und Show , was funktioniert, ist aber offensichtlich nicht ideal.

Andererseits ist es unklar, ob die üblichen Kandidaten für die schnelle Serialisierung, wie die cereal -Bibliothek, die an ByteStrings arbeiten, tatsächlich in GHCJS effizient sein werden. Darüber hinaus scheint die GHCJS-API die Interaktion von ByteStrings mit dem binären Blob -Typ, den die JavaScript-Bindungen zu WebSockets bereitstellen, zu erschweren.

Generische Code-Generierung (mit GHC.Generics ) wäre nett.

Hat jemand dieses Problem vorher gelöst? Möglicherweise sogar Benchmarking verschiedener Serialisierungsvarianten auf GHCJS?

    
Joachim Breitner 06.12.2016, 23:46
quelle

1 Antwort

1

Wir haben im letzten Jahr nach einer schnellen Serializer / Deserializer-Bibliothek in Haskell gesucht, um Daten in einem Reddis-Cache zu speichern, und am Ende haben wir mit ProtoBuf! Das lag teilweise daran, dass wir bereits die ProtoBuf-Implementierung aller Objekte hatten, die wir serialisieren wollten, aber die Leistung war auch viel besser im Vergleich zu Cereal / Binär. Zu der Zeit war speichern nicht existent.

Die Größe und Geschwindigkeit der Serialisierung / Deserialisierung hängt sehr stark von Ihren Daten ab. Zum Beispiel, wenn Sie viele kleine (sagen wir im Bereich 1 bis 100) 64-Bit-Nummern haben, protobuf (wegen seiner Base-128-Variante Kodierung) oder sogar JSON könnte effizienter sein als Müsli oder Binär (das ich denke, eine feste Größe für Zahlen unabhängig von ihren Werten verwenden).

Es gibt auch Typed-Wire , mit dem Sie Serialisierung in ein paar Sprachen durchführen können, aber ich denke es verwendet JSON als zugrunde liegende Implementierung.

Ich habe keine Erfahrung mit GHCJS, aber ich würde empfehlen, store zuerst zu versuchen. Stellen Sie nur sicher, dass Client und Server keine kleine / große Endian-Inkompatibilität haben.

    
Hapal 07.12.2016 01:22
quelle