以下代碼示例需要大約 2 秒的時間來執行。然而,當第 14 行中的 bang 模式被移除時,需要 60 秒。誰能解釋發生了什么?
我正在使用嚴格的 MVar,因此無論放入 MVar 中的內容,都應完全評估為正常形式。在插入 MVar 之前,我不希望 Bang 模式有任何明顯的效果。
{-# LANGUAGE BangPatterns #-}
import Control.Concurrent.MVar.Strict
import qualified Data.Text as T
import Data.Text.Encoding
main :: IO ()
main = do
mvar <- newMVar T.empty
let bsArr = map (\i -> encodeUtf8 $ T.pack $ "some strange string " show i) [0 .. 30000 :: Int]
mvarWriter =
\lbs ->
let !decoded = decodeUtf8 lbs
in modifyMVar_ mvar (\oldText -> return $ oldText <> decoded)
mapM_ (\lbs -> mvarWriter lbs) bsArr
print . T.length =<< readMVar mvar
uj5u.com熱心網友回復:
您的代碼大致相當于:
let !decoded = decodeUtf8 lbs
oldText <- takeMVar mvar
let !newText = oldText <> decoded
putMVar mvar newText
沒有爆炸模式是這樣的:
oldText <- takeMVar mvar
let !newText = oldText <> decodeUtf8 lbs
putMVar mvar newText
如果沒有 bang 模式,計算會在可能的最晚點發生。那是在插入新值之前。然而,此時 theMVar
是空的:oldText
已經被取出了。在此期間,沒有其他執行緒可以計算任何東西。所以這意味著在任何給定時間只有一個執行緒可以進行實際計算。
decodeUtf8 lbs
在采取之前要評估的爆炸模式力MVar
。因此,這部分計算可以與其他執行緒并行發生。只有相對便宜的oldText <> decoded
計算需要發生在臨界區。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/477442.html
上一篇:創建一個生成逆矩陣的函式
下一篇:Haskell:非型別變數引數