git.iko.soy/distributed-process
on master help sign in
Don't set forking client separately
8049006Edsko de Vries
benchmarks/JustPing.gnuplot−2
@@ -2,7 +2,6 @@ set title "Roundtrip (us)"
2set yrange [0:200]
2set yrange [0:200]
3plot "JustPingHaskell.data" smooth bezier with lines title "JustPingHaskell (NOT -threaded)", \
3plot "JustPingHaskell.data" smooth bezier with lines title "JustPingHaskell (NOT -threaded)", \
4 "JustPingHaskell2.data" smooth bezier with lines title "JustPingHaskell", \
4 "JustPingHaskell2.data" smooth bezier with lines title "JustPingHaskell", \
5− "JustPingForkClient.data" smooth bezier with lines title "JustPingForkClient", \
6 "JustPingNaiveHeader.data" smooth bezier with lines title "JustPingNaiveHeader", \
5 "JustPingNaiveHeader.data" smooth bezier with lines title "JustPingNaiveHeader", \
7 "JustPingOneRecv.data" smooth bezier with lines title "JustPingOneRecv", \
6 "JustPingOneRecv.data" smooth bezier with lines title "JustPingOneRecv", \
8 "JustPingCacheHeader.data" smooth bezier with lines title "JustPingCacheHeader", \
7 "JustPingCacheHeader.data" smooth bezier with lines title "JustPingCacheHeader", \
@@ -11,7 +10,6 @@ set terminal postscript color
11set output "JustPing.ps"
10set output "JustPing.ps"
12plot "JustPingHaskell.data" smooth bezier with lines title "JustPingHaskell (NOT -threaded)", \
11plot "JustPingHaskell.data" smooth bezier with lines title "JustPingHaskell (NOT -threaded)", \
13 "JustPingHaskell2.data" smooth bezier with lines title "JustPingHaskell", \
12 "JustPingHaskell2.data" smooth bezier with lines title "JustPingHaskell", \
14− "JustPingForkClient.data" smooth bezier with lines title "JustPingForkClient", \
15 "JustPingNaiveHeader.data" smooth bezier with lines title "JustPingNaiveHeader", \
13 "JustPingNaiveHeader.data" smooth bezier with lines title "JustPingNaiveHeader", \
16 "JustPingOneRecv.data" smooth bezier with lines title "JustPingOneRecv", \
14 "JustPingOneRecv.data" smooth bezier with lines title "JustPingOneRecv", \
17 "JustPingCacheHeader.data" smooth bezier with lines title "JustPingCacheHeader", \
15 "JustPingCacheHeader.data" smooth bezier with lines title "JustPingCacheHeader", \
benchmarks/JustPingCacheHeader.hs+20−14
@@ -28,8 +28,9 @@ import Data.Time (getCurrentTime, diffUTCTime, NominalDiffTime)
28
28
29main :: IO ()
29main :: IO ()
30main = do
30main = do
31− [pingsStr] <- getArgs
31+ [pingsStr] <- getArgs
32 serverReady <- newEmptyMVar
32 serverReady <- newEmptyMVar
33+ clientDone <- newEmptyMVar
33
34
34 -- Start the server
35 -- Start the server
35 forkIO $ do
36 forkIO $ do
@@ -51,19 +52,24 @@ main = do
51 putStrLn "server: listening for pings"
52 putStrLn "server: listening for pings"
52 pong clientSock
53 pong clientSock
53
54
54− -- Client
55+ -- Start the client
56+ forkIO $ do
55− takeMVar serverReady
57+ takeMVar serverReady
56− let pings = read pingsStr
58+ let pings = read pingsStr
57− serverAddrs <- getAddrInfo
59+ serverAddrs <- getAddrInfo
58− Nothing
60+ Nothing
59− (Just "127.0.0.1")
61+ (Just "127.0.0.1")
60− (Just "8080")
62+ (Just "8080")
61− let serverAddr = head serverAddrs
63+ let serverAddr = head serverAddrs
62− sock <- socket (addrFamily serverAddr) Stream defaultProtocol
64+ sock <- socket (addrFamily serverAddr) Stream defaultProtocol
63−
65+
64− N.connect sock (addrAddress serverAddr)
66+ N.connect sock (addrAddress serverAddr)
65−
67+
66− ping sock pings
68+ ping sock pings
69+ putMVar clientDone ()
70+
71+ -- Wait for the client to finish
72+ takeMVar clientDone
67
73
68pingMessage :: ByteString
74pingMessage :: ByteString
69pingMessage = pack "ping123"
75pingMessage = pack "ping123"
benchmarks/JustPingForkClient.hsdeleted−107
@@ -1,107 +0,0 @@
1−{-# LANGUAGE CPP, BangPatterns #-}
2−
3−module Main where
4−
5−import Control.Monad
6−
7−import Data.Int
8−import qualified Data.Serialize as Ser
9−import Data.Word (Word8)
10−import Network.Socket
11− ( AddrInfoFlag (AI_PASSIVE), HostName, ServiceName, Socket
12− , SocketType (Stream), SocketOption (ReuseAddr)
13− , accept, addrAddress, addrFlags, addrFamily, bindSocket, defaultProtocol
14− , defaultHints
15− , getAddrInfo, listen, setSocketOption, socket, sClose, withSocketsDo )
16−import System.Environment (getArgs, withArgs)
17−import Data.Time (getCurrentTime, diffUTCTime, NominalDiffTime)
18−import System.IO (withFile, IOMode(..), hPutStrLn, Handle, stderr)
19−import Control.Concurrent (forkIO)
20−import Control.Concurrent.MVar (newEmptyMVar, takeMVar, putMVar)
21−import qualified Network.Socket as N
22−import Debug.Trace
23−import Data.ByteString (ByteString)
24−import Data.ByteString.Char8 (pack, unpack)
25−import qualified Data.ByteString as BS
26−import qualified Network.Socket.ByteString as NBS
27−import Data.Time (getCurrentTime, diffUTCTime, NominalDiffTime)
28−
29−main :: IO ()
30−main = do
31− [pingsStr] <- getArgs
32− serverReady <- newEmptyMVar
33− clientDone <- newEmptyMVar
34−
35− -- Start the server
36− forkIO $ do
37− putStrLn "server: creating TCP connection"
38− serverAddrs <- getAddrInfo
39− (Just (defaultHints { addrFlags = [AI_PASSIVE] } ))
40− Nothing
41− (Just "8080")
42− let serverAddr = head serverAddrs
43− sock <- socket (addrFamily serverAddr) Stream defaultProtocol
44− setSocketOption sock ReuseAddr 1
45− bindSocket sock (addrAddress serverAddr)
46−
47− putStrLn "server: awaiting client connection"
48− putMVar serverReady ()
49− listen sock 1
50− (clientSock, clientAddr) <- accept sock
51−
52− putStrLn "server: listening for pings"
53− pong clientSock
54−
55− -- Client
56− forkIO $ do
57− takeMVar serverReady
58− let pings = read pingsStr
59− serverAddrs <- getAddrInfo
60− Nothing
61− (Just "127.0.0.1")
62− (Just "8080")
63− let serverAddr = head serverAddrs
64− sock <- socket (addrFamily serverAddr) Stream defaultProtocol
65−
66− N.connect sock (addrAddress serverAddr)
67−
68− ping sock pings
69− putMVar clientDone ()
70−
71− -- Wait for the client to be complete
72− takeMVar clientDone
73−
74−pingMessage :: ByteString
75−pingMessage = pack "ping123"
76−
77−ping :: Socket -> Int -> IO ()
78−ping sock pings = go pings
79− where
80− go :: Int -> IO ()
81− go 0 = do
82− putStrLn $ "client did " ++ show pings ++ " pings"
83− go !i = do
84− before <- getCurrentTime
85− send sock pingMessage
86− bs <- recv sock 8
87− after <- getCurrentTime
88− -- putStrLn $ "client received " ++ unpack bs
89− let latency = (1e6 :: Double) * realToFrac (diffUTCTime after before)
90− hPutStrLn stderr $ show i ++ " " ++ show latency
91− go (i - 1)
92−
93−pong :: Socket -> IO ()
94−pong sock = do
95− bs <- recv sock 8
96− -- putStrLn $ "server received " ++ unpack bs
97− when (BS.length bs > 0) $ do
98− send sock bs
99− pong sock
100−
101−-- | Wrapper around NBS.recv (for profiling)
102−recv :: Socket -> Int -> IO ByteString
103−recv = NBS.recv
104−
105−-- | Wrapper around NBS.send (for profiling)
106−send :: Socket -> ByteString -> IO Int
107−send = NBS.send
benchmarks/JustPingHaskell.hs+19−13
@@ -28,8 +28,9 @@ import Data.Time (getCurrentTime, diffUTCTime, NominalDiffTime)
28
28
29main :: IO ()
29main :: IO ()
30main = do
30main = do
31− [pingsStr] <- getArgs
31+ [pingsStr] <- getArgs
32 serverReady <- newEmptyMVar
32 serverReady <- newEmptyMVar
33+ clientDone <- newEmptyMVar
33
34
34 -- Start the server
35 -- Start the server
35 forkIO $ do
36 forkIO $ do
@@ -51,19 +52,24 @@ main = do
51 putStrLn "server: listening for pings"
52 putStrLn "server: listening for pings"
52 pong clientSock
53 pong clientSock
53
54
54− -- Client
55+ -- Start the client
56+ forkIO $ do
55− takeMVar serverReady
57+ takeMVar serverReady
56− let pings = read pingsStr
58+ let pings = read pingsStr
57− serverAddrs <- getAddrInfo
59+ serverAddrs <- getAddrInfo
58− Nothing
60+ Nothing
59− (Just "127.0.0.1")
61+ (Just "127.0.0.1")
60− (Just "8080")
62+ (Just "8080")
61− let serverAddr = head serverAddrs
63+ let serverAddr = head serverAddrs
62− sock <- socket (addrFamily serverAddr) Stream defaultProtocol
64+ sock <- socket (addrFamily serverAddr) Stream defaultProtocol
63−
65+
64− N.connect sock (addrAddress serverAddr)
66+ N.connect sock (addrAddress serverAddr)
67+
68+ ping sock pings
69+ putMVar clientDone ()
65
70
66− ping sock pings
71+ -- Wait for the client to finish
72+ takeMVar clientDone
67
73
68pingMessage :: ByteString
74pingMessage :: ByteString
69pingMessage = pack "ping123"
75pingMessage = pack "ping123"
benchmarks/JustPingNaiveHeader.hs+19−13
@@ -28,8 +28,9 @@ import Data.Time (getCurrentTime, diffUTCTime, NominalDiffTime)
28
28
29main :: IO ()
29main :: IO ()
30main = do
30main = do
31− [pingsStr] <- getArgs
31+ [pingsStr] <- getArgs
32 serverReady <- newEmptyMVar
32 serverReady <- newEmptyMVar
33+ clientDone <- newEmptyMVar
33
34
34 -- Start the server
35 -- Start the server
35 forkIO $ do
36 forkIO $ do
@@ -51,19 +52,24 @@ main = do
51 putStrLn "server: listening for pings"
52 putStrLn "server: listening for pings"
52 pong clientSock
53 pong clientSock
53
54
54− -- Client
55+ -- Start the client
56+ forkIO $ do
55− takeMVar serverReady
57+ takeMVar serverReady
56− let pings = read pingsStr
58+ let pings = read pingsStr
57− serverAddrs <- getAddrInfo
59+ serverAddrs <- getAddrInfo
58− Nothing
60+ Nothing
59− (Just "127.0.0.1")
61+ (Just "127.0.0.1")
60− (Just "8080")
62+ (Just "8080")
61− let serverAddr = head serverAddrs
63+ let serverAddr = head serverAddrs
62− sock <- socket (addrFamily serverAddr) Stream defaultProtocol
64+ sock <- socket (addrFamily serverAddr) Stream defaultProtocol
63−
65+
64− N.connect sock (addrAddress serverAddr)
66+ N.connect sock (addrAddress serverAddr)
67+
68+ ping sock pings
69+ putMVar clientDone ()
65
70
66− ping sock pings
71+ -- Wait for the client to finish
72+ takeMVar clientDone
67
73
68pingMessage :: ByteString
74pingMessage :: ByteString
69pingMessage = pack "ping123"
75pingMessage = pack "ping123"
benchmarks/JustPingOneRecv.hs+19−13
@@ -28,8 +28,9 @@ import Data.Time (getCurrentTime, diffUTCTime, NominalDiffTime)
28
28
29main :: IO ()
29main :: IO ()
30main = do
30main = do
31− [pingsStr] <- getArgs
31+ [pingsStr] <- getArgs
32 serverReady <- newEmptyMVar
32 serverReady <- newEmptyMVar
33+ clientDone <- newEmptyMVar
33
34
34 -- Start the server
35 -- Start the server
35 forkIO $ do
36 forkIO $ do
@@ -51,19 +52,24 @@ main = do
51 putStrLn "server: listening for pings"
52 putStrLn "server: listening for pings"
52 pong clientSock
53 pong clientSock
53
54
54− -- Client
55+ -- Start the client
56+ forkIO $ do
55− takeMVar serverReady
57+ takeMVar serverReady
56− let pings = read pingsStr
58+ let pings = read pingsStr
57− serverAddrs <- getAddrInfo
59+ serverAddrs <- getAddrInfo
58− Nothing
60+ Nothing
59− (Just "127.0.0.1")
61+ (Just "127.0.0.1")
60− (Just "8080")
62+ (Just "8080")
61− let serverAddr = head serverAddrs
63+ let serverAddr = head serverAddrs
62− sock <- socket (addrFamily serverAddr) Stream defaultProtocol
64+ sock <- socket (addrFamily serverAddr) Stream defaultProtocol
63−
65+
64− N.connect sock (addrAddress serverAddr)
66+ N.connect sock (addrAddress serverAddr)
67+
68+ ping sock pings
69+ putMVar clientDone ()
65
70
66− ping sock pings
71+ -- Wait for the client to finish
72+ takeMVar clientDone
67
73
68pingMessage :: ByteString
74pingMessage :: ByteString
69pingMessage = pack "ping123"
75pingMessage = pack "ping123"
benchmarks/Makefile.JustPing+1−8
@@ -6,7 +6,6 @@ NUMPINGS=100000
6run: JustPingC.data \
6run: JustPingC.data \
7 JustPingHaskell.data \
7 JustPingHaskell.data \
8 JustPingHaskell2.data \
8 JustPingHaskell2.data \
9− JustPingForkClient.data \
10 JustPingNaiveHeader.data \
9 JustPingNaiveHeader.data \
11 JustPingOneRecv.data \
10 JustPingOneRecv.data \
12 JustPingCacheHeader.data
11 JustPingCacheHeader.data
@@ -21,9 +20,6 @@ JustPingHaskell.data: JustPingHaskell
21JustPingHaskell2.data: JustPingHaskell2
20JustPingHaskell2.data: JustPingHaskell2
22 time ./JustPingHaskell2 $(NUMPINGS) 2>JustPingHaskell2.data
21 time ./JustPingHaskell2 $(NUMPINGS) 2>JustPingHaskell2.data
23
22
24−JustPingForkClient.data: JustPingForkClient
25− time ./JustPingForkClient $(NUMPINGS) 2>JustPingForkClient.data
26−
27JustPingNaiveHeader.data: JustPingNaiveHeader
23JustPingNaiveHeader.data: JustPingNaiveHeader
28 time ./JustPingNaiveHeader $(NUMPINGS) 2>JustPingNaiveHeader.data
24 time ./JustPingNaiveHeader $(NUMPINGS) 2>JustPingNaiveHeader.data
29
25
@@ -42,9 +38,6 @@ JustPingHaskell: JustPingHaskell.hs
42JustPingHaskell2: JustPingHaskell.hs
38JustPingHaskell2: JustPingHaskell.hs
43 ghc -o JustPingHaskell2 -O2 -threaded JustPingHaskell.hs
39 ghc -o JustPingHaskell2 -O2 -threaded JustPingHaskell.hs
44
40
45−JustPingForkClient: JustPingForkClient.hs
46− ghc -o JustPingForkClient -O2 -threaded JustPingForkClient.hs
47−
48JustPingNaiveHeader: JustPingNaiveHeader.hs
41JustPingNaiveHeader: JustPingNaiveHeader.hs
49 ghc -o JustPingNaiveHeader -O2 -threaded JustPingNaiveHeader.hs
42 ghc -o JustPingNaiveHeader -O2 -threaded JustPingNaiveHeader.hs
50
43
@@ -56,6 +49,6 @@ JustPingCacheHeader: JustPingCacheHeader.hs
56
49
57.PHONY: clean
50.PHONY: clean
58clean:
51clean:
59− rm -f *.data *.ps *.pdf JustPingC JustPingHaskell JustPingHaskell2 JustPingForkClient JustPingNaiveHeader JustPingOneRecv JustPingCacheHeader
52+ rm -f *.data *.ps *.pdf JustPingC JustPingHaskell JustPingHaskell2 JustPingNaiveHeader JustPingOneRecv JustPingCacheHeader
60
53
61# vi:set noexpandtab:
54# vi:set noexpandtab: