我正在编写一个网络原型,其中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
?
答案 0 :(得分:16)
我相信binary package为二进制格式提供非常有效的去/序列化。
编辑:请求了代码,这是(BSD3)文档中的Generic
示例:
{-# 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
。请注意,该包具有其他一些可能有用的功能,并且可以自定义该格式。