2011-11-13 15 views
5

Quiero probar el rendimiento (solicitud por segundo) del servidor http de haskell warp. No sé nada sobre Haskell. Quiero hacer lo mismo que en el código de Erlang a continuación:Haskell Warp Performance vs Erlang Misultin testing (cómo cargar el contenido de un archivo una vez y servir en respuesta)

  1. carga "page.txt" sólo una vez desde el disco (archivo ASCII 100 kB)
  2. sirven contenido de ese archivo en cada petición, pero sin volver a cargar desde el disco

¿Cómo hacer esto en haskell?

Erlang:

-module(test). 
-export([start/0]). 

start() -> 
    {ok, Bin} = file:read_file("page.txt"), 
    misultin:start_link([{port, 3000}, {loop, fun(Req) -> Req:ok(Bin) end}]). 

me encontré con este ejemplo Haskell y necesito modificado para utilizar los contenidos cargados desde un archivo.

Haskell:

{-# LANGUAGE OverloadedStrings #-} 
import Network.Wai 
import Network.Wai.Handler.Warp 
import Blaze.ByteString.Builder (fromByteString) 
import Network.HTTP.Types (status200) 

main = run 3000 $ const $ return $ ResponseBuilder 
    status200 
    [("Content-Type", "text/plain"), ("Content-Length", "4")] 
    $ fromByteString "TEST" 

por favor ayuda! :)

+4

Cuando tenga algunos resultados de prueba comparativa, publíquelos en alguna parte. – augustss

Respuesta

6

leer el contenido del archivo como un estricto ByteString usando hGetContents de Data.ByteString, luego pasarlo a fromByteString de Blaze:

{-# LANGUAGE OverloadedStrings #-} 
import Network.Wai 
import Network.Wai.Handler.Warp 
import Blaze.ByteString.Builder (fromByteString) 
import Network.HTTP.Types (status200) 
import System.IO (withBinaryFile, IOMode (..)) 
import Data.ByteString (hGetContents) 

main = do 
    contents <- withBinaryFile "full/path/to/page.txt" ReadMode hGetContents 
    run 3000 $ const $ return $ ResponseBuilder 
     status200 
     [("Content-Type", "text/plain"), ("Content-Length", "4")] 
     $ fromByteString contents 

no he tenido que trabajar con rutas relativas en Windows, pero eso podría ser simplemente mi falta de Haskell-fu.

+2

Por cierto, el 'duro-codificado 'Content-Length' como" 4 "es más probable que esté equivocado la mayor parte del tiempo ... :-) – hvr

+0

Lo noté durante las pruebas. Temía que la E/S perezosa me estuviera mordiendo otra vez. –

+2

¿Por qué no simplemente 'contents <- Data.ByteString.readFile" full/path/to/page.txt "'? –

Cuestiones relacionadas