- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始在 Haskell 中使用 GHC 为多核机器编写并发程序。作为第一步,我决定编写一个同时读取和写入 IOArray 的程序。我的印象是对 IOArray 的读写不涉及同步。我这样做是为了建立一个基线,以与其他使用适当同步机制的数据结构的性能进行比较。我遇到了一些令人惊讶的结果,即在许多情况下,我根本没有得到任何加速。这让我想知道在 ghc 运行时是否发生了一些低级别的同步,例如,同步和阻塞评估 thunk(即“黑洞”)。以下是详细信息...
我在一个程序上写了几个变体。主要思想是我写了一个 DirectAddressTable 数据结构,它只是一个 IOArray 的包装器,提供插入和查找方法:
-- file DirectAddressTable.hs
module DirectAddressTable
( DAT
, newDAT
, lookupDAT
, insertDAT
, getAssocsDAT
)
where
import Data.Array.IO
import Data.Array.MArray
newtype DAT = DAT (IOArray Int Char)
-- create a fixed size array; missing keys have value '-'.
newDAT :: Int -> IO DAT
newDAT n = do a <- newArray (0, n - 1) '-'
return (DAT a)
-- lookup an item.
lookupDAT :: DAT -> Int -> IO (Maybe Char)
lookupDAT (DAT a) i = do c <- readArray a i
return (if c=='-' then Nothing else Just c)
-- insert an item
insertDAT :: DAT -> Int -> Char -> IO ()
insertDAT (DAT a) i v = writeArray a i v
-- get all associations (exclude missing items, i.e. those whose value is '-').
getAssocsDAT :: DAT -> IO [(Int,Char)]
getAssocsDAT (DAT a) =
do assocs <- getAssocs a
return [ (k,c) | (k,c) <- assocs, c /= '-' ]
-- file DirectTableTest.hs
import DirectAddressTable
import Control.Concurrent
import Control.Parallel
import System.Environment
main =
do args <- getArgs
let numThreads = read (args !! 0)
vs <- sequence (replicate numThreads newEmptyMVar)
a <- newDAT arraySize
sequence_ [ forkIO (doLotsOfStuff numThreads i a >>= putMVar v)
| (i,v) <- zip [1..] vs]
sequence_ [ takeMVar v >>= \a -> getAssocsDAT a >>= \xs -> print (last xs)
| v <- vs]
doLotsOfStuff :: Int -> Int -> DAT -> IO DAT
doLotsOfStuff numThreads i a =
do let p j c = (c `seq` insertDAT a j c) >>
lookupDAT a j >>= \v ->
v `pseq` return ()
sequence_ [ p j c | (j,c) <- bunchOfKeys i ]
return a
where bunchOfKeys i = take numElems $ zip cyclicIndices $ drop i cyclicChars
numElems = numberOfElems `div` numThreads
cyclicIndices = cycle [0..highestIndex]
cyclicChars = cycle chars
chars = ['a'..'z']
-- Parameters
arraySize :: Int
arraySize = 100
highestIndex = arraySize - 1
numberOfElems = 10 * 1000 * 1000
最佳答案
Running "time ./DirectTableTest 1 +RTS -N1" takes about 1.4 seconds and running "time ./DirectTableTest 2 +RTS -N2" take about 2.0 seconds!
$ time ./so2 1 +RTS -N1
(99,'k')
real 0m0.950s
user 0m0.932s
sys 0m0.016s
tommd@Mavlo:Test$ time ./so2 2 +RTS -N2
(99,'s')
(99,'s')
real 0m0.589s
user 0m1.136s
sys 0m0.024s
ghc -O2 so2.hs -threaded -rtsopts
[1 of 2] Compiling DirectAddressTable2 ( DirectAddressTable2.hs, DirectAddressTable2.o )
[2 of 2] Compiling Main ( so2.hs, so2.o )
Linking so2 ...
tommd@Mavlo:Test$ time ./so2 4
(99,'n')
(99,'z')
(99,'y')
(99,'y')
real 0m1.538s
user 0m1.320s
sys 0m0.216s
tommd@Mavlo:Test$ time ./so2 4 +RTS -N2
(99,'z')
(99,'x')
(99,'y')
(99,'y')
real 0m0.600s
user 0m1.156s
sys 0m0.020s
-Nx
) 比可用 CPU 多,那么您的结果将非常糟糕。我想我真正要问的是:您确定您的系统上没有其他 CPU 密集型进程正在运行吗?
I understand why IOUArray might perform better than IOArray, but I don't know why it scales better to multiple threads and cores
关于haskell - 在 Haskell 中并发读写 IOArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7194826/
有没有一种方法可以有效地从 IOArray 中构造切片(子阵列 View )? , 或 MArray 一般来说?也就是说,取同一个数组,只是限制边界。签名可以是 (MArray a e m, Ix i
我正在测试各种内存方法的速度。下面的代码比较了两种使用数组进行内存的实现。我在递归函数上对此进行了测试。完整代码如下 用 stack test 为 memoweird 1000、memoweird 5
我开始在 Haskell 中使用 GHC 为多核机器编写并发程序。作为第一步,我决定编写一个同时读取和写入 IOArray 的程序。我的印象是对 IOArray 的读写不涉及同步。我这样做是为了建立一
我是一名优秀的程序员,十分优秀!