Remove a painful slowdown from randomIV
This commit is contained in:
parent
d05160f458
commit
4d2f4a3b4f
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,5 @@
|
|||||||
*.o
|
*.o
|
||||||
|
*.o_p
|
||||||
*.hi
|
*.hi
|
||||||
dist
|
dist
|
||||||
*.swp
|
*.swp
|
||||||
|
|||||||
@ -343,12 +343,12 @@ defaultYesodRunner _ m toMaster _ murl _ req
|
|||||||
[] -> Nothing
|
[] -> Nothing
|
||||||
(x, _):_ -> Just x
|
(x, _):_ -> Just x
|
||||||
defaultYesodRunner s master toMasterRoute mkey murl handler req = do
|
defaultYesodRunner s master toMasterRoute mkey murl handler req = do
|
||||||
now <- liftIO getCurrentTime
|
now <- {-# SCC "getCurrentTime" #-} liftIO getCurrentTime
|
||||||
let getExpires m = fromIntegral (m * 60) `addUTCTime` now
|
let getExpires m = {-# SCC "getExpires" #-} fromIntegral (m * 60) `addUTCTime` now
|
||||||
let exp' = getExpires $ clientSessionDuration master
|
let exp' = {-# SCC "exp'" #-} getExpires $ clientSessionDuration master
|
||||||
let rh = takeWhile (/= ':') $ show $ W.remoteHost req
|
let rh = {-# SCC "rh" #-} takeWhile (/= ':') $ show $ W.remoteHost req
|
||||||
let host = if sessionIpAddress master then S8.pack rh else ""
|
let host = if sessionIpAddress master then S8.pack rh else ""
|
||||||
let session' =
|
let session' = {-# SCC "session'" #-}
|
||||||
case mkey of
|
case mkey of
|
||||||
Nothing -> []
|
Nothing -> []
|
||||||
Just key -> fromMaybe [] $ do
|
Just key -> fromMaybe [] $ do
|
||||||
@ -356,7 +356,7 @@ defaultYesodRunner s master toMasterRoute mkey murl handler req = do
|
|||||||
val <- lookup sessionName $ parseCookies raw
|
val <- lookup sessionName $ parseCookies raw
|
||||||
decodeSession key now host val
|
decodeSession key now host val
|
||||||
rr <- liftIO $ parseWaiRequest req session' mkey
|
rr <- liftIO $ parseWaiRequest req session' mkey
|
||||||
let h = do
|
let h = {-# SCC "h" #-} do
|
||||||
case murl of
|
case murl of
|
||||||
Nothing -> handler
|
Nothing -> handler
|
||||||
Just url -> do
|
Just url -> do
|
||||||
@ -377,7 +377,8 @@ defaultYesodRunner s master toMasterRoute mkey murl handler req = do
|
|||||||
$ filter (\(x, _) -> x /= nonceKey) session'
|
$ filter (\(x, _) -> x /= nonceKey) session'
|
||||||
yar <- handlerToYAR master s toMasterRoute (yesodRender master) errorHandler rr murl sessionMap h
|
yar <- handlerToYAR master s toMasterRoute (yesodRender master) errorHandler rr murl sessionMap h
|
||||||
let mnonce = reqNonce rr
|
let mnonce = reqNonce rr
|
||||||
iv <- liftIO CS.randomIV
|
-- FIXME should we be caching this IV value and reusing it for efficiency?
|
||||||
|
iv <- {-# SCC "iv" #-} maybe (return $ error "Should not be used") (const $ liftIO CS.randomIV) mkey
|
||||||
return $ yarToResponse (hr iv mnonce getExpires host exp') yar
|
return $ yarToResponse (hr iv mnonce getExpires host exp') yar
|
||||||
where
|
where
|
||||||
hr iv mnonce getExpires host exp' hs ct sm =
|
hr iv mnonce getExpires host exp' hs ct sm =
|
||||||
|
|||||||
8
yesod-core/bench.sh
Executable file
8
yesod-core/bench.sh
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash -ex
|
||||||
|
|
||||||
|
ghc --make bench/pong.hs
|
||||||
|
ghc --make bench/pong.hs -prof -osuf o_p -caf-all -auto-all -rtsopts
|
||||||
|
./bench/pong +RTS -p &
|
||||||
|
sleep 2
|
||||||
|
ab -n 1000 -c 5 http://localhost:3000/ 2>&1 | grep 'Time taken'
|
||||||
|
curl http://localhost:3000/kill
|
||||||
32
yesod-core/bench/pong.hs
Normal file
32
yesod-core/bench/pong.hs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings, QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
|
||||||
|
import Yesod.Dispatch
|
||||||
|
import Yesod.Content
|
||||||
|
import Yesod.Internal.Core
|
||||||
|
import Data.ByteString (ByteString)
|
||||||
|
import Network.Wai.Handler.Warp (run)
|
||||||
|
import Control.Concurrent.MVar
|
||||||
|
import Control.Concurrent
|
||||||
|
import Network.Wai
|
||||||
|
import Control.Monad.IO.Class
|
||||||
|
|
||||||
|
data Pong = Pong
|
||||||
|
mkYesod "Pong" [$parseRoutes|
|
||||||
|
/ PongR GET
|
||||||
|
|]
|
||||||
|
|
||||||
|
instance Yesod Pong where
|
||||||
|
approot _ = ""
|
||||||
|
encryptKey _ = return Nothing
|
||||||
|
|
||||||
|
getPongR = return $ RepPlain $ toContent ("PONG" :: ByteString)
|
||||||
|
|
||||||
|
main = do
|
||||||
|
app <- toWaiAppPlain Pong
|
||||||
|
flag <- newEmptyMVar
|
||||||
|
forkIO $ run 3000 $ \req ->
|
||||||
|
if pathInfo req == ["kill"]
|
||||||
|
then do
|
||||||
|
liftIO $ putMVar flag ()
|
||||||
|
error "done"
|
||||||
|
else app req
|
||||||
|
takeMVar flag
|
||||||
Loading…
Reference in New Issue
Block a user