我正在编写一个从输入流中读取的程序,即 erl -run p main -noshell -s erlang halt input 问题是使用这个读取函数需要花费大量时间来读取它(输入流很大): read_input(L) - case io:get_line("") of eof - li
erl -run p main -noshell -s erlang halt < input
问题是使用这个读取函数需要花费大量时间来读取它(输入流很大):
read_input(L) ->
case io:get_line("") of
eof ->
lists:reverse(L);
E0 ->
read_input([E0|L])
end.
我一直在寻找更有效的替代方案,但我一无所获.我试过用它来读取文件
{ok, Binary} = file:read_file("input")
这远远高效得多.问题是我必须在名称未知的平台上运行此程序,所以我需要一些替代方法来执行此操作.另外,我不能选择运行时使用的标志,例如flag -noinput无法添加到命令行.
无论您给予什么帮助,都会受到欢迎.
虽然 Steve’s solution是我所知道的最快的解决方案,但可以使用具有相当好性能的文件模块解决方案:-module(p).
-export([start/0]).
-define(BLK_SIZE, 16384).
start() ->
do(),
halt().
do() ->
Bin = read(),
io:format("~p~n", [byte_size(Bin)]).
read() ->
ok = io:setopts(standard_io, [binary]),
read(<<>>).
read(Acc) ->
case file:read(standard_io, ?BLK_SIZE) of
{ok, Data} ->
read(<<Acc/bytes, Data/bytes>>);
eof ->
Acc
end.
它适用于调用,如:
erl -noshell -s p < input
请注意,这两种方法都可以用于面向行的输入,使用端口或文件的{line,Max_Line_Size}选项:read_line / 1用于文件模块解决方案.从版本17开始(如果我没记错),文件中存在固定的性能错误:read_line / 1我发现它现在很好.无论如何,你不应该期望Perl的性能和舒适度.
