为什么escript输出不同的结果?

时间:2015-07-01 03:34:16

标签: erlang escript

这是一个简单而着名的测试脚本:

-module(processes).
-compile(export_all).

max(N)->
    Max=erlang:system_info(process_limit),
    io:format("the max processes is ~p ~n",[Max]),
    statistics(runtime),
    statistics(wall_clock),
    L=for(1,N,fun()->spawn(fun()->wait() end) end),
    {_,Time1}=statistics(runtime),
    {_,Time2}=statistics(wall_clock),
    lists:foreach(fun(Pid)->Pid!die end,L),
    U1=Time1*1000/N,
    U2=Time2*1000/N,
    io:format("the proecess time is ~p:~p ~n",[U1,U2]).

wait()->
    receive
        die->void
    end.

for(N,N,F)->[F()];
for(I,N,F)->[F()|for(I+1,N,F)].

main([])->
    max(100000).

这是erl的输出:

$ erl 
Erlang/OTP 17 [erts-6.2] [source] [64-bit] [smp:2:2] [async-threads:10] [kernel-poll:false]

Eshell V6.2  (abort with ^G)
1> c(processes)
1> processes:max(100000).
* 2: syntax error before: processes
1> c(processes).         
{ok,processes}
2> processes:max(100000).
the max processes is 262144 
the proecess time is 1.1:4.35 
ok

这是escript的输出:

$ escript processes.erl
the max processes is 262144 
the proecess time is 47.8:83.4

escript和erl之间的确切区别是什么? 我是erlang的新手,请帮忙!

修改

当escript运行beam文件时,它输出与erl:

相同的结果
$ escript processes.beam
the max processes is 262144 
the proecess time is 1.8:3.33

会发生什么?我知道* .beam是编译代码,但escript在运行之前不会编译脚本吗?我还是很困惑。

1 个答案:

答案 0 :(得分:0)

不同之处在于您的第二次运行正在被解释,而您的第一次运行是在编译时。运行

escript -c processes.erl

你得到的时间基本相同。您还可以通过在代码中放置指令-mode(compile).来获得此行为。

来自the documentation

  

解释代码的执行比编译代码慢。如果很多   执行发生在解释的代码中,这可能是值得的   编译它,即使编译本身需要一点点   而。这也可以提供本机而不是编译   将使用本机标志编译脚本,同样取决于   这个问题的特征可能是也可能不值得。

     

如前所述,可以有一个包含的脚本   预编译光束代码。在预编译的脚本中,解释   脚本标题与包含source的脚本完全相同   码。这意味着你可以使一个梁文件可执行   使用以#开头的行前置文件!和%%!提到   以上。在预编译的脚本中,必须导出函数main / 1.

如果您对预编译选项感兴趣,可能需要查看构建工具rebar,它具有escriptize命令,可将所有代码转换为预编译的存档使用适当的escript标题。

对于使用的口译/编译机制,您可以查看the source code to escript。您将看到的是interpret模式下的escript等效(以某种语法为模)将代码逐行粘贴到erl交互式解释器中。