[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