这是一个简单而知名的测试脚本:
-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
这是escrapt:的输出
$ escript processes.erl
the max processes is 262144
the proecess time is 47.8:83.4
escrept和erl之间的确切区别是什么?我是二郎的新手,请帮帮我!
编辑:
当escrept运行beam文件时,它输出与erl:相同的结果
$ escript processes.beam
the max processes is 262144
the proecess time is 1.8:3.33
会发生什么?我知道*.beam是编译过的代码,但escapet在运行之前不编译脚本吗?我还是很困惑。
不同之处在于,第二次运行是被解释的,而第一次运行是编译的。运行
escript -c processes.erl
你会得到一个基本相同的时间。您还可以通过在脚本中放入指令-mode(compile).
来获得此行为。
来自文件:
解释代码的执行速度比编译代码慢。如果执行发生在解释代码中,这可能是值得的编译它,即使编译本身需要一点时间虽然也可以提供本机而不是编译,这将使用本机标志编译脚本,同样取决于escept的特征这可能值得也不值得。
如前所述,可以有一个包含预编译的梁代码。在预编译的脚本中,对脚本标头与包含源的脚本中的标头完全相同密码这意味着您可以通过以#!开头的行作为文件的前缀!和%%!提到在上面在预编译的脚本中,必须导出函数main/1。
如果您对预编译选项感兴趣,您可能需要查看构建工具rebar,它有一个escriptize
命令,用于将所有代码转换为具有适当escapet头的预编译存档。
对于所使用的解释/编译机制,您可以查看要描述的源代码。您将看到,interpret
模式下的escapet相当于(对某些语法进行模化)将代码逐行粘贴到erl
交互式解释器中。