Mercurial > hg > Members > toma > Jungle-haskell
view test/ParWrite.hs @ 12:d6e95f88cda9
Write test script for check time to parallel write.
This commit support parallel write for 2 trees.
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 22 Jan 2014 12:46:34 +0900 |
parents | |
children | 3337ccc824a4 |
line wrap: on
line source
{-# LANGUAGE OverloadedStrings #-} import Control.Parallel import Control.Parallel.Strategies import Text.Printf import Jungle import Data.Maybe import Data.List import Data.Time.Clock import qualified Data.ByteString.Lazy.Char8 as B import Control.Exception import System.Environment treeId :: String treeId = "test_tree" treeId2 :: String treeId2 = "hoge_tree" treeDepth :: Int treeDepth = 5 lastPos :: [Int] lastPos = last $ concatMap permutations . subsequences $ [0..treeDepth] writeCount :: Int writeCount = 100000 main = do jungle <- createTree createJungle treeId jungle <- createTree jungle treeId2 node <- getRootNode jungle treeId let miniTree = testTree node treeDepth updateRootNode jungle treeId miniTree putStrLn $ show $ size miniTree t0 <- getCurrentTime printTimeSince t0 sequence_ $ runEval $ dualWrite jungle tree1 <- getRootNode jungle treeId tree2 <- getRootNode jungle treeId2 print $ fromJust (getAttributes tree1 lastPos (show (writeCount-1))) print $ fromJust (getAttributes tree2 lastPos (show (writeCount-1))) printTimeSince t0 -- parallel write for two trees by singleWrite dualWrite jungle = do x <- rpar (mapM runEval (singleWrite jungle writeCount treeId)) y <- rpar (mapM runEval (singleWrite jungle writeCount treeId2)) return [x, y] -- paralell write for single tree singleWrite :: Jungle -> Int -> String -> [Eval (IO ())] singleWrite jungle writeCount treeId = zipWith parApply (writeFunctions writeCount) (repeat jungle) where parApply f jungle = (rseq.runEval.rpar) (updateRootNodeWith f jungle treeId) -- generate functions to node update writeFunctions :: Int -> [(Node -> Node)] writeFunctions writeCount = map apply [0..writeCount] where apply x node = putAttribute node lastPos (show x) (B.pack . show $ x) -- utils from ParRead testTree node h = foldl' (add h) node (concatMap permutations . subsequences $ [0..h]) where add w node h = addc node h w addc node h w = foldl' (add h) node [0..w] where add h node pos = addNewChildAt node h pos printTimeSince t0 = do t1 <- getCurrentTime printf "time: %.2fs\n" (realToFrac (diffUTCTime t1 t0) :: Double)