Mar 22

管道是不是可以提高运行效率 不指定

felix021 @ 2009-3-22 22:31 [IT » 操作系统] 评论(1) , 引用(0) , 阅读(6093) | Via 本站原创 | |
看了一个帖子,讨论这个问题的
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'




欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
sandy
2009-3-25 16:04
管道,虽然理论上是并行的,但是实际上很多时候不会。

两个进程都sleep,这个例子太极端,如果你用一个前后输入输出关联的管道,那就不会是这个结果了。比如你可以编写两个计算器,然后让前面的结果是后面的输入,再测测情况。

“一头写,一头读,同时处理”——虽然理论上是这样没错,但是因为buffer的存在,几乎大部分时刻一头在操作管道另一头的Thread就会被blocked,要真正实现并行还是没那么容易的。

管道实质上是进程间通讯的一种方式,是很耗资源的。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]