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上,编译成本非常低,以至于您总是希望在运行之前编译您的描述(因为大多数时间它会花费几毫秒,有时会节省几秒钟)。