第26章:高效字串處理
base——String [Char],bytestring——ASCII,test——Unicode字串
1.bytestring函式庫
- 處理二進位制資料
- vector函式庫中Vector表示這樣的型別
Char預設表示Unicode編碼的字元,所以用Word8來代替C語言裡的Char
--適合大量的連續資料處理 --Data.Vector.Mutable IOVector Word8 --Data.Vector.Unboxed Vector Word8 --Data.Vector Vector Word8
bytestring函式庫ByteString型別(也常稱strict ByteString)
import qualified Data.ByteString as BS data ByteString = PS {-# UNPACK #-} !(ForeignPtr Word8) -- payload {-# UNPACK #-} !Int -- offset {-# UNPACK #-} !Int -- length
+ByteString包含一個指向Word8的指標,一個偏移量和一個長度
+ForeignPtr可以方便讓外部C呼叫的指標型別
+偏移量和長度的資料可以用來實現快速的字串分割等操作
+函式庫中提供的各種操作函式:head,length,map,foldl,reverse等
Lazy ByteString
使用連續區域儲存資料的問題,拼接操作申請記憶體有可能失敗而不得不把整個資料複製到新區域,且拼接ByteString的操作需要複製整個陣列的資料導致效率低;另一方面,連結串列資料結構是分散在記憶體中,但拼接操作只是對指標的操作,所以效率高,但訪問效能又低下。——Data.ByteString.Lazy中的Lazy ByteString能兼顧這兩種資料結構的優點。
+Lazy ByteString基本思路是分段表示一個字串,每一個子段內部是Strict ByteString,子段間通過指標相連
data ByteString = Empty | Chunk {-# UNPACK #-} !S.ByteString ByteString
+Data.ByteString.Streaming 流處理 streaming
ByteString Builder
+局域性優化——通過改造程式使用的資料結構,使之充分利用CPU快取記憶體實現加速
--預設返回Chunk尺寸是32KB的Lazy ByteString hGetContents :: Handle -> IO ByteString readFile :: FilePath -> IO ByteString ...
+為了自適應Chunk尺寸,尺寸小時使用記憶體複製的方式進行拼接,否則自動轉換為使用指標相連 +Data.ByteString.Builder Builder型別
data BufferRange = BufferRange {-# UNPACK #-} !(Ptr Word8) -- First byte of range {-# UNPACK #-} !(Ptr Word8) -- First byte /after/ range data Buffer = Buffer {-# UNPACK #-} !(ForeignPtr Word8) {-# UNPACK #-} !BufferRange data BuildSignal a = Done {-# UNPACK #-} !(Ptr Word8) a | BufferFull {-# UNPACK #-} !Int {-# UNPACK #-} !(Ptr Word8) (BuildStep a) | InsertChunk {-# UNPACK #-} !(Ptr Word8) S.ByteString (BuildStep a) type BuildStep a = BufferRange -> IO (BuildSignal a) newtype Builder = Builder (forall r. BuildStep r -> BuildStep r)
+操作Builder型別的函式
2.text和utf8-string函式庫
- UTF8 UTF16 UTF32
基於UTF16的text函式庫,處理文字
data Text = Text {-# UNPACK #-} !A.Array -- payload (Word16 elements) {-# UNPACK #-} !Int -- offset (units of Word16, not Char) {-# UNPACK #-} !Int -- length (units of Word16, not Char)
在處理Text型別時,通過組合基於Char的操作,在底層操作時text函式庫會自動完成UTF16和UTF32的轉換
- text函式庫的模組結構和bytestring類似
- 處理UTF8編碼字串的 utf8-string函式庫
一個統一的型別類
class IsString a where fromString :: String -> a
3. mono-traversable 函式庫
- 為了抽象上面介紹的關於字串 ByteString、Text 型別
- Data.MonoTraversable
Element型別家族
type family Element mono
推薦使用這個模組去處理一些和底層資料型別無關的計算模組,使得編寫的演算法和底層容器資料型別無關
相關文章
- 第7章 處理塊損壞
- 字串處理字串
- awk 字串處理字串
- abap 字串處理字串
- windows批處理之一:字串處理Windows字串
- JAVA 程式設計思想 第13章 字串Java程式設計字串
- 面向網路的PHP開發第26章PHP
- 第26章 自動監視和更正操作
- jstl處理字串JS字串
- javascript字串處理類JavaScript字串
- LoadRunner字串處理 - 補齊字串字串
- [MYSQL -26]控制事務處理MySql
- Guava字串處理Joiner、SplitterGuava字串
- PHP 陣列 & 字串處理PHP陣列字串
- shell字串處理總結字串
- 簡單的字串處理字串
- SqlServer——字串處理函式SQLServer字串函式
- 字串的封送處理字串
- shell中字串的處理字串
- 安全字串處理函式字串函式
- GoldenGate COLMAP字串處理Go字串
- 處理字串的小程式字串
- bat 批處理字串操作BAT字串
- C++語言程式設計筆記 - 第12章 - 異常處理C++程式設計筆記
- [譯] Transducers: JavaScript 中高效的資料處理 Pipeline(第 18 部分)JavaScript
- 第8章 高效開發和使用外掛 (一)
- 第8章 高效開發和使用外掛 (二)
- 第8章 高效開發和使用外掛 (三)
- 使用Excel高效處理資料Excel
- 【讀書筆記】:《編寫可維護的JavaScript》第07章 事件處理筆記JavaScript事件
- 《Mybatis 手擼專欄》第10章:使用策略模式,呼叫引數處理器MyBatis模式
- c primer plue 第 16 章 C前處理器和C庫 筆記筆記
- ORA-600 [2662]故障處理
- JavaScript常用的字串處理方法JavaScript字串
- MySQL 之動態字串處理MySql字串
- sql對於字串的處理SQL字串
- php字串處理函式大全PHP字串函式
- PHP系列(五)PHP字串處理PHP字串