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);
}

}

Post a Comment