我目前正在使用最小的 Web 服务器,例如 Cowboy。我想在 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 个请求的答复。
提前致谢!