linux管道效率测试
九月 23, 2009 – 10:27 上午管道效率测试
管道技术是Linux的一种基本的进程间通信技术。
由于不产生中间文件,效率会更好一些。
下面以字符集转化为例测试实际中管道对效率的提升
实现目标:
1,将文件0_gbk.dat由gbk转化为utf8
2,将前一步的文件从utf8转化为gbk
例一,不使用管道
[oracle@dw_testdb sunwg]$ time iconv -f gbk -t utf8 0_gbk.dat > 0_utf8.dat
real 0m50.347s
user 0m14.114s
sys 0m5.433s
[oracle@dw_testdb sunwg]$ time iconv -t gbk -f utf8 0_utf8.dat > 1_gbk.dat
real 0m53.732s
user 0m13.147s
sys 0m5.167s
total= 50.347 + 53.732 = 104.079
例二,使用管道 |
[oracle@dw_testdb sunwg]$ time iconv -f gbk -t utf8 0_gbk.dat | iconv -t gbk -f utf8 > 1_gbk.dat
real 1m13.568s
user 0m25.193s
sys 0m32.453s
total= 73.568
例三,c实现管道
[oracle@dw_testdb sunwg]$ time ./sunwg
real 0m29.478s
user 0m12.397s
sys 0m2.169s
total= 29.478
结论:
上面的执行时间可能会受系统当时load的影响,但总的说来管道提高效率40%以上。
附录:
sunwg.c
#include
#include
#include
#include
#include
#include
#include
int main()
{
int data_processed;
int file_pipes[2];
const char some_data[]=”123″;
char buffer[BUFSIZ+1];
int fork_result;
int filedes;
int filedes1;
int tt=0;
if((filedes=open(”ff.txt”,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))<0)
fprintf(stderr,”%s “,”open file error”);
memset(buffer,0,sizeof(buffer));
pipe(file_pipes);
fork_result=fork();
if(fork_result==0)
{
close(file_pipes[1]);
dup2(filedes,1);
dup2(file_pipes[0],0);
execlp(”iconv”,”iconv”,”-f utf8″,”-t gbk”,0);
exit(EXIT_SUCCESS);
}
else
{
close(1);
close(file_pipes[0]);
dup(file_pipes[1]);
execlp(”iconv”,”iconv”,”-f gbk”,”-t utf8″,”0_gbk.dat”,0);
waitpid(fork_result,NULL,0);
exit(EXIT_SUCCESS);
}
}