Haskell Warp Performance vs Erlang Misultin测试(如何加载文件内容并作为响应)

Ter*_*ska 5 erlang performance webserver haskell

我想测试haskell warp http服务器的性能(每秒请求数).我对haskell一无所知.我想和下面的erlang代码一样:

  1. 从磁盘加载"page.txt"一次(ascii文件100kB)
  2. 在每个请求上提供该文件的内容,但不从磁盘重新加载

在haskell中如何做到这一点?

二郎:

-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}]).
Run Code Online (Sandbox Code Playgroud)

我遇到了这个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"
Run Code Online (Sandbox Code Playgroud)

请帮忙!:)

小智 6

ByteString使用hGetContentsfrom 读取文件的内容作为严格Data.ByteString,然后将其传递给Blaze 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
Run Code Online (Sandbox Code Playgroud)

我没有在Windows上使用相对路径,但这可能只是我缺乏Haskell-fu.

  • 顺便说一句,硬编码的`Content-Length`为"4"在大多数情况下很可能是错误的...... :-) (2认同)
  • 为什么不简单地`contents < - Data.ByteString.readFile"full/path/to/page.txt"`? (2认同)