看了一个帖子,讨论这个问题的
URL:
http://bbs.chinaunix.net/archiver/?tid-1399973.html第一页4L的说法是正确的,那些的确是滥用管道,不过这个问题放到后面讨论。
感觉第一页末尾beginner-bj的测试方法不很对头,于是自己写了个小程序测试一下:
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char * argv[]){
char cmd[1024];
if(argc < 3) {
printf("Not Enough Parameters.\n");
return 1;
}
int a, b;
sscanf(argv[1], "%d", &a);
sscanf(argv[2], "%d", &b);
sprintf(cmd, "sleep %d | sleep %d", a, b);
system(cmd);
return 0;
}
测试结果如下:
引用
felix021@felix021-laptop:~/code$ g++ a.cpp
felix021@felix021-laptop:~/code$ ./a.out 1 2
felix021@felix021-laptop:~/code$ time ./a.out 2 2
real 0m2.035s
user 0m0.000s
sys 0m0.020s
felix021@felix021-laptop:~/code$ time ./a.out 2 3
real 0m3.039s
user 0m0.012s
sys 0m0.016s
felix021@felix021-laptop:~/code$ time ./a.out 4 3
real 0m4.020s
user 0m0.016s
sys 0m0.004s
felix021@felix021-laptop:~/code$ time ./a.out 6 3
real 0m6.034s
user 0m0.004s
sys 0m0.020s
看来管道两头确实是协同工作的(从管道的原理也可以推知)
一头写,一头读,同时处理,这样可以提高CPU的利用率,特别是在多CPU的时候
不过总体来说,我想应该是会多占用一些CPU(进程之间的切换什么的?)。
然后关注一下滥用管道的问题,这个直接引用第二页某楼的vbs100童鞋的大作,应该可以说明问题了:
引用
正确的是
$ grep 'some word' urfile
但是更方便的是
$ <urfile grep 'some word'
这样可方便改 grep 的参数
还有经常用的
$ cat urfile | grep 'some word' | wc -l
其实直接可以用
$ <urfile grep -c 'some word'