changeset 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 a30ec665df9d
children 9df5178e867c
files test/ParWrite.hs
diffstat 1 files changed, 84 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/ParWrite.hs	Wed Jan 22 12:46:34 2014 +0900
@@ -0,0 +1,84 @@
+{-# 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)