2011-11-13 4 views
5

Voglio testare le prestazioni (richiesta per sec) di haskell warp http server. Non so nulla di haskell. Io voglio fare lo stesso come nel codice Erlang di seguito:Haskell Warp Performance vs Erlang Misultin testing (come caricare il contenuto di un file una volta e servire in risposta)

  1. carico "page.txt" solo una volta dal disco (file 100kB ascii)
  2. servono contenuto di tale file su ogni richiesta, ma senza ricaricare dal disco

Come fare questo in 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}]). 

mi sono imbattuto in questo esempio Haskell e ho bisogno di modificata in modo da utilizzare i contenuti caricati da un file.

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" 

Aiutateci! :)

+4

Quando si hanno dei risultati di riferimento, si prega di pubblicarli da qualche parte. – augustss

risposta

6

leggere il contenuto del file come un rigoroso ByteString utilizzando hGetContents da Data.ByteString, poi passarlo al fromByteString di 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 

non ho avuto di lavorare con i percorsi relativi a Windows, ma potrebbe essere solo la mia mancanza di Haskell-fu.

+2

Btw, il 'Content-Length' hard-coded come" 4 "è molto probabilmente sbagliato la maggior parte del tempo ... :-) – hvr

+0

L'ho notato durante i test. Avevo paura che I/O pigro mi stesse mordendo di nuovo. –

+2

Perché non semplicemente 'content <- Data.ByteString.readFile" completo/percorso/alla/pagina.txt "'? –

Problemi correlati