Это простой и хорошо известный тестовый скрипт:Почему 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
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, помогите!
Edit:
Когда escript запускает файл луча, то выход такой же результат, как Эрл:
$ escript processes.beam
the max processes is 262144
the proecess time is 1.8:3.33
Что происходит? Я знаю, что * .beam - это скомпилированные коды, но escript не компилирует скрипт перед его запуском? Я все еще смущен.
Спасибо за подробный ответ! Каково точное представление кодов внутри erlang vm?Я думал, что исходные файлы будут преобразованы в байт-коды так же, как и другие языки, например. питон. Компиляция означает преобразование байт-кода? Тогда я думал, что escript должен сделать это до запуска в любом случае. – kingluo
Я добавил немного больше деталей. Я считаю, что Python компилируется перед запуском (по умолчанию используется что-то вроде режима esc '-c'). Я подозреваю, что на современном ПК или быстрее стоимость компиляции настолько мала, что вы всегда хотите скомпилировать свои скрипты перед запуском (потому что большую часть времени это будет стоить несколько мс, а иногда это будет экономить секунды). –
Большое спасибо! – kingluo