Son zamanlarda sıkı bytestrings doğrudan inşaat hızlı bir inşaatçı karıştığı olandan büyüklükte bir sipariş olabileceğini keşfettim benim proje üzerinde kriterler çalıştırdıktan sonra sıkı ByteStrings yaratır.Verimli
bir inşaatçı kullanan Örneğin, bir kodlayıcı uygulaması:
encoder :: Int64 -> Data.ByteString.ByteString
encoder =
unpackIntBySize 8
unpackIntBySize :: (Bits a, Integral a) => Int -> a -> Data.ByteString.ByteString
unpackIntBySize n x =
Data.ByteString.pack $ map f $ reverse [0..n - 1]
where
f s =
fromIntegral $ shiftR x (8 * s)
: Doğrudan bytestring oluşturur ve daha fazla optimizasyon için farklı olasılıklar vardır biri daha kötü 10 kez gibi
encoder :: Int64 -> Data.ByteString.ByteString
encoder =
Data.ByteString.Lazy.toStrict .
Data.ByteString.Builder.toLazyByteString .
Data.ByteString.Builder.int64BE
gerçekleştirdiği
benim soru iki yönlüdür:
Wh y
Builder
'danByteString
numaralı telefona doğrudan dönüşüm yok mu? Sık sık sadece kenditoStrict
işlevini kullanmakData.ByteString.Lazy
ithal etmek zorunda çünküData.ByteString.Builder
sadecetoLazyByteString
ortaya çıkarır, çünkü, sinir bozucu.- belirtilen deneyim ancak bunun bir sebebi yoksa o anda bana, merak yaptı. Nedeni ile tamamen yanlış kullanım modelini uygulamam. Yani, gerçekten yanlış mı ve daha iyi bir alternatif var mı? BTW, ben
Data.ByteString.Builder.Prim
hakkında biliyorum, ama yukarıdaki gibi bir durumda kullanmak, çok fark yaratacağından şüpheliyim.
İlginç. Günlük çalışmam için yapımcı -> tembel ByteString -> sıkı Bytestring'in sadece çok sayıda kısa diziden büyük bir dizge oluştururken ödediğini varsayıyorum. Ben genelde paketlerim. Sayılardan katı bs'ye dönüştürmek için göster ... iyi olup olmadığını bilmiyorum. Performansı ölçmek için kullanılabilecek bir kod gönderebilir misiniz? Bu ilginç bir konuya benziyor. – dsign
Kodlayıcıları belirtilen iki farklı stratejiyi kullanarak uygulayan "postgresql-binary" projesinin iki dalı vardır. Her ikisi de kodlama performansı kriterleriyle gelir. İşte burada [kodlayıcıların doğrudan 'ByteString' inşası kullanılarak uygulandığı bir ağaç] (https://github.com/nikita-volkov/postgresql-binary/tree/911a32110cfd618e2f7d377f4acc4c8f593f9acc), işte burada [Builder'ın etrafında dönen] (https://github.com/nikita-volkov/postgresql-binary/tree/2fb6954968763621cbbdb8ba8505434ec2961b9e). –
Zahmet Builder' yazmak için gerekli bayt sayısı tutmaz 'olduğunu düşünüyorum sonuçlanan rağmen dışarı bytestring bu ya statik olarak bilinen (O (1)) veya O (tembel akışı yapmıyoruz zaman n) but-muhtemelen-değer-it. Arabellek oluşturucuyu kontrol edebilir ve ihtiyacınız olanı yaptırabilirsin. Burada tartışmaya bakın: https://github.com/chadaustin/buffer-builder/issues/7 – jberryman