为了证实Erlang传说中“Crazy Fast”的进程创建速度,今天特意在自己机上(AMD 3600+ 双核,1G内存,Ubuntu 8.10操作系统)测试了一下Erlang创建进程的时间,所用代码如下:
-module(test).
-export([start/1]).
%记录开始时间并开始生成指定数量进程
start(Num) ->
statistics(wall_clock),
spawnProcesses(Num).
%所有进程生成完后输出所耗时间
spawnProcesses(0) ->
{_,Time}=statistics(wall_clock),
io:fwrite(”Total Time : ~p\n”,[Time]);
%生成进程
spawnProcesses(Num) ->
spawn(fun() -> doSomething(Num) end),
spawnProcesses(Num-1).
%什么都不做的进程~~
doSomething(Num) -> Num.
运行Erlang虚拟机编译&运行:
1> c(test).
{ok,test}
2> test:start(1000000).
4768
….
统计结果表明Erlang生成一百万个进程约需4.7秒,亦即平均下来生成一个进程仅需4.7us,确实是很短的时间了~~但没有对比说明不了什么,与C生成线程的速度比哪个更快些呢?马上写段C代码看看:
#include
#include
#include
//什么都不干的线程~~
void thread(){}
//主函数
int main(){
int i;
clock_t start,end;
//记录开始时间
start=clock();
//生成很多很多线程
for(i=0;i<100000;i++){
pthread_t id;
pthread_create(&id,NULL,(void *)thread,NULL);
}
//记录结束时间
end=clock();
double time=(double)((end-start)/CLOCKS_PER_SEC);
printf(”Total Time : %f\n”,time);
}
编译运行命令如下:
gcc test.c -lpthread
./a.out
统计表明C生成十万进程就已经需要接近4秒了,比Erlang慢了接近10倍,看来Erlang疯快的轻量级进程不是浪的虚名的~~不过有好长时间没写C了,如果上面代码或测试方式有任何问题,欢迎留言提出大家讨论讨论~~
0 意見