私は現在、ゲームのネットコードで丁寧にシリアル化とデシリアライズを行うために、bytestring
とattoparsec
を使用しています。私はもともとcereal
よりもこれらのライブラリを使用することに惹きつけられました。なぜなら、bytestring
は、有用なalloctation strategiesとlow-level primativesを含む、ビルダーよりかなり細かい制御を与えるからです。私は、プロジェクトで後で実行することができるレイテンシー/ GCの問題に対処するための設備が整っていることを確認するため、良い選択だと思っていました。Attoparsec:Data.WordとData.Intのデータ型を簡単に解析できますか?
そしてbytestring
一つは、パケットフィールド(主にWord16
ようData.Word
とData.Int
で見つかったタイプ、Word16
、およびInt8
)で遭遇する一般的なデータ型にコンビネータの多くを提供しながら、私は任意の補完を見つけることができなかったとき、私はがっかりしましたコンビネータはattoparsec
です。何か不足していますか?私は、提供されたコンビネータと同等のものを模倣することができますか?
機能が不足している場合は、この機能を追加する通常の方法は何ですか?私は確かに、ライブラリと署名されたショートを解読する必要がある最初のものではありません。この機能が存在しない理由はありますか?共通の図書館がありますか?私には分かりませんが、attoparsec
を補足する必要がありますか?これは内部的に何をすべきかcereal
とbinary
であると私は現在、当分の間、この機能を得るためにやっているが、使用する必要はありませんしいいだろうので
import Data.Bits
import qualified Data.ByteString as B
import qualified Data.ByteString.Unsafe as B
import qualified Data.Attoparsec.ByteString as Decode
import Data.Int
decodeInt16BE :: Decode.Parser Int16
decodeInt16BE = do
bs <- Decode.take 2
return $! (fromIntegral (bs `B.unsafeIndex` 0) `shiftL` 8) .|.
(fromIntegral (bs `B.unsafeIndex` 1) 1))
:または私はこのような何かを行う必要がありますbytestring
、cereal
、およびbinary
がAPIで既に提供しているものを実行するために、アドホックで安全でない機能を使用します。彼らは、低遅延ネットワーク環境でattoparsecでInt64
、Int32
、Int16
、Int8
、Word64
、Word32
、およびWord16
に取り組む必要がある場合
は、ほとんどの人は何をしますか?
(NEWBIE NOTE)ここでは、ナイーブでもよいという前提があります。私は暗黙のうちにcereal
がbytestring
とattoparsec
の実装よりもネットワークパケットを処理する方が高速ではないと仮定しています。この仮定は、バッファ内のバイナリデータの符号化および復号化に対する継続的なアプローチのために、cereal
およびbinary
で行われるかなり多くの割り当てを指すtalks coming out on binary-serialise-cborの一部を見たことに由来していました。私はしばしばエンコード/デコードサブルーチンが以前に見たフィールドの値に依存しているときどきのフィールドで、かなり簡単でステートレスな方法でエンコードおよびデコードできるネットワークパケットを扱っています。たぶん私はここで現実のチェックが必要な仕事のための間違ったツールを使用していますか?私の状況を改善するために、この高レベルで私ができることは本当にないのでしょうか?この場合、「時期尚早に最適化しないでください」は適用されないとします。
'B.unsafeIndex'は文字列が十分に長いと分かっていれば完全に安全です。 – ErikR