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

Erlang 为什么escript输出不同的结果?,erlang,escript,Erlang,Escript,这是一个简单且众所周知的测试脚本: -模块(进程)。 -编译(全部导出)。 最大值(N)-> Max=erlang:system\u info(进程限制), io:format(“最大进程为~p~n”,[max]), 统计(运行时), 统计数据(挂钟), L=for(1,N,fun()->spawn(fun()->wait()end)end), {{uU1Time1}=统计信息(运行时), {{uu,Time2}=统计数据(挂钟), 列表:foreach(fun(Pid)->Pid!模具末端,L

这是一个简单且众所周知的测试脚本:

-模块(进程)。
-编译(全部导出)。
最大值(N)->
Max=erlang:system\u info(进程限制),
io:format(“最大进程为~p~n”,[max]),
统计(运行时),
统计数据(挂钟),
L=for(1,N,fun()->spawn(fun()->wait()end)end),
{{uU1Time1}=统计信息(运行时),
{{uu,Time2}=统计数据(挂钟),
列表:foreach(fun(Pid)->Pid!模具末端,L),
U1=时间1*1000/N,
U2=时间2*1000/N,
io:format(“进程时间为~p:~p~n”,[U1,U2])。
等待()->
接收
模具->无效
结束。
对于(N,N,F)->[F()];
对于(I,N,F)->[F()|对于(I+1,N,F)]。
主要([])->
最高限额(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的确切区别是什么? 我是二郎的新手,请帮帮我

编辑:

当escript运行beam文件时,它将输出与erl相同的结果:

$ escript processes.beam
the max processes is 262144 
the proecess time is 1.8:3.33

会发生什么?我知道*.beam是编译过的代码,但是escript在运行它之前没有编译脚本吗?我仍然感到困惑。

不同的是,第二次运行是被解释的,而第一次运行是被编译的。跑

escript -c processes.erl
你会得到一个基本相同的时间。您还可以通过在脚本中放入指令
-mode(compile)。
来获得此行为

发件人:

解释代码的执行比编译代码慢。如果大部分 执行在解释代码中进行,这可能值得一提 编译它,即使编译本身需要一点时间 虽然也可以提供本机而不是编译,这 将使用本机标志编译脚本,这同样取决于 这本书的特点可能值得,也可能不值得

如前所述,可以有一个包含 预编译梁代码。在预编译脚本中,对 脚本头与包含源代码的脚本中的头完全相同 代码。这意味着您可以通过 用以#开头的行预结束文件!和%%!提到 在上面在预编译脚本中,必须导出函数main/1

如果您对预编译选项感兴趣,您可能希望查看构建工具,它有一个
escriptize
命令,用于将所有代码转换为具有适当escript头的预编译存档


有关使用的解释/编译机制,您可以查看。您将看到,
exploration
模式中的escript相当于(对一些语法进行模块化)将代码逐行粘贴到
erl
交互式解释器中。

谢谢您的详细回答!erlang vm中代码的确切表示形式是什么?我想不管怎样,源文件都会像其他语言一样转换成字节码,比如python。编译意味着字节码转换?然后我想escript无论如何都必须在运行之前完成它。我添加了更多的细节。我相信Python会在运行之前编译(默认为类似escript的
-c
模式)。我怀疑在现代PC或更快的PC上,编译成本非常低,以至于您总是希望在运行之前编译您的描述(因为大多数时间它会花费几毫秒,有时会节省几秒钟)。