0

私は現在、Cowboy のような最小限の Web サーバーで遊んでいます。URL に数値を渡し、ファイルの行を読み込み、これらの行を並べ替え、要素を途中で出力して IO と並べ替えをテストしたいと考えています。したがって、コードは /123 のようなパスをロードし、数字からパディングされた "00123" を作成し、ファイル "input00123.txt" をロードしてその内容をソートし、"input00123.txt 0.50000" のようなものを返します。

同時に、50 の同時リクエストを行うテスト ツールがあり、2 つだけが応答され、残りはタイムアウトします。

私のハンドラーは次のようになります。

-module(toppage_handler).  
-export([init/3]).   
-export([handle/2]).   
-export([terminate/3]).    

init(_Transport, Req, []) ->
    {ok, Req, undefined}.

readlines(FileName) ->
    {ok, Device} = file:open(FileName, [read]),
    get_all_lines(Device, []).

get_all_lines(Device, Accum) ->
   case io:get_line(Device, "") of
       eof  -> file:close(Device), Accum;
       Line -> get_all_lines(Device, Accum ++ [Line])
   end.

handle(Req, State) ->
    {PathBin, _} = cowboy_req:path(Req),
    case PathBin of
       <<"/">> -> Output = <<"Hello, world!">>;
       _ -> PathNum = string:substr(binary_to_list(PathBin),2),
            Num = string:right(PathNum, 5, $0),
            Filename = string:concat("input",string:concat(Num, ".txt")),
            Filepath = string:concat("../data/",Filename),
            SortedLines = lists:sort(readlines(Filepath)),
            MiddleIndex = erlang:trunc(length(SortedLines)/2),
            MiddleElement = lists:nth(MiddleIndex, SortedLines),
            Output = iolist_to_binary(io_lib:format("~s\t~s",[Filename,MiddleElement]))
    end,
    {ok, ReqRes} = cowboy_req:reply(200, [], Output, Req),
    {ok, ReqRes, State}.

terminate(_Reason, _Req, _State) ->
    ok.

これを Windows で実行して、.NET と比較しています。ソート/IOをスレッドで実行するなど、これをよりパフォーマンス的にする方法はありますか、どうすれば改善できますか? cygwin で実行しても結果はあまり変わりませんでした。約 5 ~ 6 件のリクエストに回答がありました。

前もって感謝します!

4

1 に答える 1