1

これは単純でよく知られたテスト スクリプトです。

-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 がビーム ファイルを実行すると、erl と同じ結果が出力されます。

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

何が起こるのですか?*.beam がコンパイルされたコードであることは知っていますが、escript はスクリプトを実行する前にコンパイルしませんか? 私はまだ混乱しています。

4

1 に答える 1

1

違いは、最初の実行がコンパイルされている間に、2 回目の実行が解釈されることです。走る

escript -c processes.erl

基本的に同じ時間を取得できます。スクリプトにディレクティブ-mode(compile).を配置することで、この動作を取得することもできます。

ドキュメントから:

解釈されたコードの実行は、コンパイルされたコードよりも遅くなります。実行の大部分が解釈されたコードで行われる場合は、コンパイル自体に少し時間がかかりますが、コンパイルする価値があるかもしれません。コンパイルの代わりにネイティブを指定することもできます。これにより、ネイティブ フラグを使用してスクリプトがコンパイルされます。これも、escript の特性に応じて、価値がある場合とそうでない場合があります。

前述のように、プリコンパイルされたビーム コードを含むスクリプトを使用することができます。プリコンパイル済みスクリプトでは、スクリプト ヘッダーの解釈は、ソース コードを含むスクリプトの場合とまったく同じです。つまり、ファイルの前に #! で始まる行を追加することで、ビーム ファイルを実行可能にすることができます。と %%!上記の通り。プリコンパイル済みスクリプトでは、関数 main/1 をエクスポートする必要があります。

プリコンパイル済みオプションに興味がある場合は、ビルド ツールrebarを確認してください。これには、escriptizeすべてのコードを適切な escript ヘッダーを持つプリコンパイル済みアーカイブに変換するコマンドがあります。

使用される解釈/コンパイルのメカニズムについては、ソースコードを escript にチェックアウトできます。モードでの escript は、コードを対話型インタープリターに 1 行interpretずつ貼り付けることと同等 (いくつかの構文を法とする)であることがわかります。erl

于 2015-07-01T11:19:42.290 に答える