2011-11-13 6 views
5

Chcę przetestować wydajność (żądanie na sekundę) serwera HTTP warp haskell. Nic nie wiem o haskell. Chcę zrobić to samo, jak w kodzie erlang poniżej:Haskell Warp Performance vs Erlang Misultin testing (jak załadować zawartość pliku raz i służyć w odpowiedzi)

  1. obciążenie „page.txt” tylko raz z dysku (ASCII plik 100kB)
  2. służyć zawartość tego pliku na każde żądanie, ale bez przeładowywania go z dysku

Jak to zrobić w 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}]). 

natknąłem się na ten przykład Haskell i muszę modyfikować go używać zawartość załadowane z pliku.

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" 

Proszę o pomoc! :)

+4

Po uzyskaniu wyników testów porównawczych należy je gdzieś opublikować. – augustss

Odpowiedz

6

Czytaj zawartość pliku jako ścisłym ByteString z wykorzystaniem hGetContentsData.ByteString, a następnie przekazać je do Blaze za fromByteString:

{-# 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 

nie dostałem go do pracy ze ścieżek względnych na Windows, ale to może być mój brak Haskell-fu.

+2

Przy okazji, zakodowany "Content-Length" jako "4" jest najprawdopodobniej niewłaściwy przez większość czasu ... :-) – hvr

+0

Zauważyłem to podczas testów. Bałem się, że leniwy I/O znowu mnie gryzie. –

+2

Dlaczego nie po prostu 'contents <- Data.ByteString.readFile" full/path/to/page.txt "'? –