{-# LANGUAGE OverloadedStrings, LambdaCase #-}
module Latency where
import Control.Applicative
import Control.Monad (void, forM_, forever, replicateM_)
import Control.Concurrent (forkOS, threadDelay)
import Control.Concurrent.MVar
import Control.Distributed.Process
import Control.Distributed.Process.Node
import Criterion.Measurement
import Data.Binary (encode, decode)
import Data.ByteString.Char8 (pack)
import qualified Data.ByteString.Lazy as BSL
import Network.Transport.ZMQ (createTransport, defaultZMQParameters)
import System.Environment
import Text.Printf
pingServer :: Process ()
pingServer = forever $ do
them <- expect
send them ()
pingClient :: Int -> ProcessId -> Process ()
pingClient n them = do
us <- getSelfPid
replicateM_ n $ send them us >> (expect :: Process ())
initialServer :: Process ()
initialServer = do
us <- getSelfPid
liftIO $ BSL.writeFile "pingServer.pid" (encode us)
pingServer
initialClient :: Int -> Process ()
initialClient n = do
them <- liftIO $ decode <$> BSL.readFile "pingServer.pid"
pingClient n them
main :: IO ()
main = getArgs >>= \case
[] -> defaultBenchmark
[role, host] -> do
Right transport <- createTransport defaultZMQParameters (pack host)
node <- newLocalNode transport initRemoteTable
case role of
"SERVER" -> runProcess node initialServer
"CLIENT" -> fmap read getLine >>= runProcess node . initialClient
_ -> error "wrong role"
_ -> error "either call benchmark with [SERVER|CLIENT] host or without arguments"
defaultBenchmark :: IO ()
defaultBenchmark = do
-- server
void . forkOS $ do
Right transport <- createTransport defaultZMQParameters "127.0.0.1"
node <- newLocalNode transport initRemoteTable
runProcess node $ initialServer
threadDelay 1000000
e <- newEmptyMVar
void . forkOS $ do
putStrLn "pings time\n--- ---\n"
forM_ [100,200,600,800,1000,2000,5000,8000,10000] $ \i -> do
Right transport <- createTransport defaultZMQParameters "127.0.0.1"
node <- newLocalNode transport initRemoteTable
d <- time_ (runProcess node $ initialClient i)
printf "%-8i %10.4f\n" i d
putMVar e ()
takeMVar e