Производительность Haskell Warp против тестирования Эрланга Мисултина (как загрузить содержимое файла один раз и использовать в ответ) - PullRequest
5 голосов
/ 13 ноября 2011

Я хочу проверить производительность (количество запросов в секунду) http-сервера haskell warp.Я ничего не знаю о Haskell.Я хочу сделать то же самое, что и в приведенном ниже коде erlang:

  1. загрузить "page.txt" только один раз с диска (файл ascii 100 КБ)
  2. обслуживать содержимое этого файла при каждом запросено не перезагружая его с диска

Как это сделать в 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}]).

Я наткнулся на этот пример haskell, и мне нужно изменитьиспользовать содержимое, загруженное из файла.

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"

Пожалуйста, помогите!:)

1 Ответ

6 голосов
/ 13 ноября 2011

Считайте содержимое файла как строгое ByteString, используя hGetContents из Data.ByteString, а затем передайте его в fromByteString 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

Я не заставлял его работать с относительными путями в Windows, но это могло быть просто моим отсутствием Haskell-fu.

...