[Haskell-beginners] Warp and Yesod benchmark puzzle
Lorenzo Bolla
lbolla at gmail.com
Fri Aug 31 16:24:19 CEST 2012
Hi all,
This is a question specific to the Yesod framework, but simple enough
(I hope) to be considered a beginner question...
I am puzzled by the performance of these two very simple web-servers,
one written in Warp and another written in Yesod:
=== YESOD ===
{-# LANGUAGE TypeFamilies, QuasiQuotes, MultiParamTypeClasses,
TemplateHaskell #-}
import Yesod
data HelloWorld = HelloWorld
mkYesod "HelloWorld" [parseRoutes|
/ HomeR GET
|]
instance Yesod HelloWorld
getHomeR :: Handler RepHtml
getHomeR = defaultLayout [whamlet|$newline always
Hello World!
|]
main :: IO ()
-- main = warpDebug 3000 HelloWorld
main = warp 3000 HelloWorld
=== WARP ===
{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run)
import Data.ByteString.Lazy.Char8 ()
app :: Application
app _ = return $ responseLBS
status200
[("Content-Type", "text/html")]
"Hello, Warp!"
main :: IO ()
main = do
putStrLn "http://localhost:8080/"
run 8080 app
===
I've tested both using httperf:
$> httperf --hog --client=0/1 --server=localhost --port=3000 --uri=/
--rate=1000 --send-buffer=4096 --recv-buffer=16384 --num-conns=100
--num-calls=100 --burst-length=20
and I got very different results:
YESOD: Request rate: 4048.0 req/s (0.2 ms/req)
WARP: Request rate: 33656.2 req/s (0.0 ms/req)
Now, I understand that Yesod is expected to be slower than the "raw"
Warp, but I wasn't expecting a 10x slowdown, especially for such a
trivial Yesod app (no db, no auth, etc.).
[
Compilation command was: ghc -Wall -O2 --make yesod.hs
$ yesod version
yesod-core version:1.1.0
]
What is going on?
Thanks,
L.
More information about the Beginners
mailing list