一部のコードのプロファイリングでは、約 65% の時間で次のコードの内部にいることがわかりました。
それが行うことは、Data.Binary.Get モナドを使用して、ターミネータを探してバイト文字列をウォークスルーすることです。0xff を検出すると、次のバイトが 0x00 かどうかをチェックします。そうであれば、0x00 を削除して続行します。0x00 でない場合は、両方のバイトが削除され、結果のバイト リストがバイト文字列に変換されて返されます。
これを最適化する明白な方法はありますか? 見えない。
parseECS = f [] False
where
f acc ff = do
b <- getWord8
if ff
then if b == 0x00
then f (0xff:acc) False
else return $ L.pack (reverse acc)
else if b == 0xff
then f acc True
else f (b:acc) False