顯示具有 thread 標籤的文章。 顯示所有文章
顯示具有 thread 標籤的文章。 顯示所有文章

Erlang创建进程到底有多快?

2009-03-09

为了证实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了,如果上面代码或测试方式有任何问题,欢迎留言提出大家讨论讨论~~

POSIX多线程编程

POSIX多线程(Pthreads)是一个可移植的多线程库,在设计上提供了在多个操作系统平台上使用一致的程序设计接口的功能,现已是 Linux操作系统中多线程接口的标准,并广泛使用在大多数UNIX平台上,还有一个针对Windows的开源版本pthreads-win32。

创建线程

POSIX多线程库中创建线程的函数是pthread_create():

pthread_create (

pthread_t *restrict tidp, //线程ID

const pthread_attr_t *restrict attr, //线程属性(NULL=none)

void *(*start_rtn)(void), //线程执行的函数

void *restrict arg //传递到函数中的参数

);

例如:

#include

#include

#include

struct person{

char *name;

int age;

};

//线程执行的操作

void doSomething(struct person *p){

printf(”I am %s, %d years old.\n”,p->name,p->age);

}

//主函数

int main(){

int i;

char *name=”Oscar Tang”;

for(i=0;i<10;i++){

struct person p;

p.name=name;

p.age=i;

pthread_t pid;

pthread_create(&pid,NULL,(void *)doSomething,&p);

}

}

编译

由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译时要加上-lpthread参数:

M-OSCAR | Powered by Blogger | Entries (RSS) | Comments (RSS) | Designed by MB Web Design | XML Coded By Cahayabiru.com