Data.ByteString.Short
| Copyright | (c) Duncan Coutts 2012-2013 |
|---|---|
| License | BSD-style |
| Maintainer | duncan@community.haskell.org |
| Stability | stable |
| Portability | ghc only |
| Safe Haskell | Trustworthy |
| Language | Haskell98 |
Описание
Компактное представление, подходящее для хранения коротких байтовых строк в памяти.
В типичных случаях его можно импортировать вместе с Data.ByteString, например:
import qualified Data.ByteString as B
import qualified Data.ByteString.Short as B
(ShortByteString, toShort, fromShort)
Однако другие ShortByteString операции конфликтуют с функциями Data.ByteString или Prelude, поэтому их следует импортировать qualified с другим псевдонимом, например:
import qualified Data.ByteString.Short as B.Short
Тип ShortByteString
data ShortByteString Источник
Компактное представление Word8 вектора.
Он имеет меньшие затраты памяти, чем ByteString, и не приводит к дроблению кучи. Его можно преобразовать в ByteString или из него (затратившись на копирование данных строки). Он поддерживает очень мало других операций.
Он подходит для использования в качестве внутреннего представления для кода, которому нужно хранить много коротких строк в памяти, но не должен использоваться в качестве типа обмена. То есть, его обычно не следует использовать в публичных API. Тип ByteString обычно более подходит для использования в интерфейсах; он более гибкий и поддерживает широкий спектр операций.
Примеры
Затраты памяти
В GHC затраты памяти таковы, выраженные в словах и байтах (слова составляют 4 и 8 байтов на 32- или 64-разрядных машинах соответственно).
-
ByteStringнеразделяемая: 9 слов; 36 или 72 байта. -
ByteStringразделяемая подстрока: 5 слов; 20 или 40 байтов. -
ShortByteString: 4 слова; 16 или 32 байта.
Для самих данных строки и ShortByteString и ByteString используют по одному байту на элемент, округляя до ближайшего слова. Например, включая накладные расходы, строка длиной 10 ShortByteString займет 16 + 12 = 28 байт на 32-разрядной платформе и 32 + 16 = 48 байт на 64-разрядной платформе.
Эти накладные расходы можно уменьшить на 1 слово (4 или 8 байт), когда ShortByteString или ByteString распаковываются в другой конструктор.
Например:
data ThingId = ThingId {-# UNPACK #-} !Int
{-# UNPACK #-} !ShortByteString
Это займет 1 + 1 + 3 слов (конструктор ThingId + распакованный Int + распакованный ShortByteString ), плюс слова для данных строки.
Дробление кучи
В GHC представление ByteString использует закреплённую память, что означает, что она не может быть перемещена сборщиком мусора. Это обычно правильно для более длинных строк, но для коротких строк использование закреплённой памяти может привести к дроблению кучи, что приводит к потере места. Тип ShortByteString (и тип Text из пакета text ) используют незакреплённую память, поэтому они не приводят к дроблению кучи. Кроме того, в GHC короткие незакреплённые строки выделяются так же, как обычные выделения памяти в куче, а не в отдельной закреплённой области.
Преобразования
toShort :: ByteString -> ShortByteString Источник
O(n). Преобразование ByteString в ShortByteString.
Это создаёт копию, поэтому входная строка не сохраняется.
fromShort :: ShortByteString -> ByteString Источник
O(n). Преобразование ShortByteString в ByteString.
pack :: [Word8] -> ShortByteString Источник
O(n). Преобразование списка в ShortByteString.
unpack :: ShortByteString -> [Word8] Источник
O(n). Преобразование ShortByteString в список.
Другие операции
empty :: ShortByteString Источник
O(1). Пустая ShortByteString.
null :: ShortByteString -> Bool Источник
O(1) Проверка, является ли ShortByteString пустой.
length :: ShortByteString -> Int Источник
O(1) Длина ShortByteString.
index :: ShortByteString -> Int -> Word8 Источник
O(1) Оператор индекса (индексации) ShortByteString, начиная с 0.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/bytestring-0.10.6.0/Data-ByteString-Short.html