Есть ли более эффективная альтернатива чтению и показу в 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
. Обратите внимание, что пакет имеет несколько других функций, которые могут быть полезны, и что формат может быть настроен.