最近工作需要,需要先测试一下erlang启动进程的时间开销:
看了一片博客,感觉挺好的,学习erlang推荐
http://www.blogjava.net/yongboy/
于是参照他的文章里面的一个部分,(当然erlang程序设计一书的107页也有这个代码),自己着手做了下面的测试,看看erlang 创建100万个进程,每一个进程花费多少时间呢?
我的系统是OS X , 8G内存,双核四线程~
废话少说,先上代码,在代码中已经做了相关备注:
-module(processes). -export([max/1]). max(N) -> % Returns the maximum number of simultaneously % existing processes at the local node as an integer. % This limit can be configured at startup % by using the +P command line flag of erl(1). Max = erlang:system_info(process_limit), io:format("Max=:~p~n", [Max]), % 下述statistics函数可用来统计某段代码的执行时间 % Note that the run-time is the sum of the run-time for % all threads in the Erlang run-time system % and may therefore be greater than the wall-clock time. erlang:statistics(runtime), % wall_clock can be used in the same manner as runtime,except % that real time is measured as opposed to runtime or CPU time. erlang:statistics(wall_clock), % 被统计的代码区 L = for(1, N, fun() -> spawn(fun() -> wait() end) end), {_, Time1} = erlang:statistics(runtime), {_, Time2} = erlang:statistics(wall_clock), % 进程杀死 lists:foreach(fun(Pid) -> Pid ! die end, L), % 判断启动一个进程所需时间(系统时间和消耗的真实时间) U1 = Time1 * 1000 / N, U2 = Time2 * 1000 / N, io:format("process spawn time = ~p(~p) microseconds ~n", [U1, U2]). wait() -> receive die -> void end. for(_N, _N, F) -> [F()]; for(I, N, F) -> [F() | for(I + 1, N, F)].
OliviatekiMac-mini:web_test_practice olivia$ erl
Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false] [dtrace]
Eshell V5.9.2 (abort with ^G)
1> c(processes).
{ok,processes}
2> processes:max(10000000).
Max=:32768
=ERROR REPORT==== 13-May-2013::15:20:47 ===
Too many processes
这说明我的版本默认支持32768个进程,
所以,为了支持更多,
OliviatekiMac-mini:~ olivia$ cd web_test_practice/
OliviatekiMac-mini:web_test_practice olivia$ erl +P 10240000
Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false] [dtrace]
Eshell V5.9.2 (abort with ^G)
1> c(processes).
{ok,processes}
2> processes:max(1000000).
Max=:10240000
process spawn time = 3.93(4.221) mocroseconds
ok
3> processes:max(1000000).
Max=:10240000
process spawn time = 3.82(4.067) mocroseconds
ok
4> processes:max(1000000).
Max=:10240000
process spawn time = 3.79(4.012) mocroseconds
ok
5> processes:max(1000000).
Max=:10240000
process spawn time = 3.79(4.04) mocroseconds
ok
6> processes:max(1000000).
Max=:10240000
process spawn time = 3.8(4.058) mocroseconds
ok
7> processes:max(1000000).
Max=:10240000
process spawn time = 3.81(4.079) mocroseconds
ok
8> processes:max(1000000).
Max=:10240000
process spawn time = 3.85(4.146) mocroseconds
ok
9> processes:max(1000000).
Max=:10240000
process spawn time = 3.8(4.091) mocroseconds
ok
10> processes:max(1000000).
Max=:10240000
process spawn time = 3.84(4.164) mocroseconds
ok
11> processes:max(1000000).
Max=:10240000
process spawn time = 3.94(4.365) mocroseconds
ok
也就是说,
创建100万个进程,每一个进程花费3.87微秒(μs)的CPU时间,相当于4.124微秒(μs)的消耗时间(亦即消耗的真实时间),当然在一定量的区间内,其值会在一定范围内波动。要是想知道erlang到底能够并发起多少系统调用,可以参考褚霸这篇博客,http://blog.yufeng.info/archives/18