为什么splice()在我的系统上表现如此糟糕?

时间:2011-04-02 14:08:21

标签: linux linux-kernel sockets

我想测试splice()系统调用的性能。我将它与传统的读/写进行比较。

/* wr.cpp 
 * it use read/write
 */
#include  <sys/types.h>
#include  <sys/stat.h>
#include  <fcntl.h>
#include  <unistd.h>

#define BUF_SIZE 4096

int main(int argc, char *argv[])
{
    char buf[BUF_SIZE];
    int in = open("1.rmvb",O_RDONLY);
    int out = open("1.cp.rmvb",O_WRONLY|O_CREAT,0766);

    ssize_t nread;
    while( (nread = read(in,buf,BUF_SIZE)) > 0 )
    {
        write(out,buf,nread);
    }

    return 0;
}

//

/* splice.cpp 
 * it use splice
 */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif

#include  <sys/types.h>
#include  <sys/stat.h>
#include  <fcntl.h>
#include  <unistd.h>

#define BUF_SIZE 4096

int main(int argc, char *argv[])
{
    char buf[BUF_SIZE];
    int in = open("1.rmvb",O_RDONLY);
    int out = open("1.cp.rmvb",O_WRONLY|O_CREAT,0766);

    ssize_t nread;
    while( (nread = splice(in,NULL,p[1],NULL,BUF_SIZE,0)) > 0)
            splice(p[0],NULL,out,NULL,BUF_SIZE,0);


    return 0;
}

这是结果:

enter image description here

似乎spilce()没有提高性能,也没有减少CPU时间。为什么?我的内核版本是2.6.35-28,ubuntu 10.10。

1 个答案:

答案 0 :(得分:0)

你确定,你的一个描述符实际上是一个管道吗? 因为,man splice说:

  

...它将文件描述符fd_in中的len个字节数据传输到文件描述符fd_out,,其中一个描述符必须引用管道。