Искажение производительности Haskell против неправильного тестирования Erlang (как загрузить содержимое файла один раз и выдать в ответ)

#performance #haskell #erlang #webserver

#Производительность #haskell #erlang #веб-сервер

Вопрос:

Я хочу протестировать производительность (количество запросов в секунду) 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. Когда у вас будут какие-то результаты тестирования, пожалуйста, опубликуйте их где-нибудь.

Ответ №1:

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

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

Комментарии:

1. Кстати, жестко запрограммированное Content-Length значение «4», скорее всего, в большинстве случаев неверно … 🙂

2. Я заметил это во время тестирования. Я боялся, что ленивый ввод-вывод снова меня укусил.

3. Почему не просто contents <- Data.ByteString.readFile "full/path/to/page.txt" ?

4. Потому что я не рассмотрел bytestring библиотеку получше 😉