Есть ли более эффективная альтернатива чтению и показу в Haskell?

Я пишу сетевой прототип, где Server передает состояние World ко всем своим Clients. Я делаю это, используя следующий рабочий процесс:

Server --> World --> show --> ByteString --> GZip.compress   --> udp send
Client <-- World <-- read <-- ByteString <-- GZip.decompress <-- udp receive

Однако, похоже, что show и read являются узкими местами производительности - большую часть времени занимают. По мере роста World это будет только большой проблемой.

Я знаю, что в какой-то момент мне придется прекратить отправлять весь мир, но есть ли альтернативы использованию read и show для преобразования структуры данных в ByteString?

Ответы

Ответ 1

Я считаю, что двоичный пакет обеспечивает очень эффективную де-/сериализацию в/из двоичных форматов.

EDIT: запрошен код, это пример Generic из документации (BSD3):

{-# LANGUAGE DeriveGeneric #-}

import Data.Binary
import GHC.Generics (Generic)

data Foo = Foo
         deriving (Generic)

-- GHC will automatically fill out the instance
instance Binary Foo

Тогда вы можете, например, используйте encode вместо show и decode вместо read. Обратите внимание, что пакет имеет несколько других функций, которые могут быть полезны, и что формат может быть настроен.