2011-11-13 25 views
5

Tôi muốn kiểm tra hiệu suất (yêu cầu mỗi giây) của máy chủ http có lỗi dọc. Tôi không biết gì về haskell. Tôi muốn làm tương tự như trong mã erlang dưới đây:Hiệu suất Warp Haskell và thử nghiệm Erlang Misultin (cách tải nội dung của một tệp một lần và phân phối phản hồi)

  1. tải "page.txt" chỉ một lần từ đĩa (ascii tập tin 100kB)
  2. phục vụ nội dung của tập tin đó trên mọi yêu cầu nhưng không có tải lại nó từ đĩa

Cách thực hiện việc này trong 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}]). 

Tôi đã xem qua ví dụ Haskell này và tôi cần phải sửa đổi nó để sử dụng nội dung được tải từ một tập tin.

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" 

Xin giúp! :)

+4

Khi bạn có một số kết quả điểm chuẩn, vui lòng xuất bản chúng ở đâu đó. – augustss

Trả lời

6

Đọc nội dung của tập tin như một nghiêm ngặt ByteString sử dụng hGetContents từ Data.ByteString, sau đó vượt qua nó để 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 

tôi đã không nhận được nó để làm việc với đường dẫn tương đối trên Windows, nhưng đó có thể là do tôi thiếu Haskell-fu.

+2

Btw, nội dung có độ dài 'Nội dung Độ dài' là" 4 "có nhiều khả năng xảy ra hầu hết thời gian ... :-) – hvr

+0

Tôi nhận thấy rằng trong quá trình thử nghiệm. Tôi đã sợ lười biếng I/O đã cắn tôi một lần nữa. –

+2

Tại sao không chỉ đơn giản là 'nội dung <- Data.ByteString.readFile" đầy đủ/path/to/page.txt "'? –

Các vấn đề liên quan