当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – Erlang:以有效的方式从输入流中读取

来源:互联网 收集:自由互联 发布时间:2021-06-22
我正在编写一个从输入流中读取的程序,即 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的性能和舒适度.

网友评论