写入管道的最快方法

时间:2012-11-15 08:50:20

标签: c++ linux pipe fifo

我写了这个程序,在一个部分中,一个线程接受char *缓冲区并将它们写入管道 创建如下:

 ret_val = mkfifo(lpipename.c_str(), 0666);
 pipehandler = open(lpipename.c_str(), O_RDWR);

然后我按如下方式将一个缓冲区写入管道:

 int size = string(pcstr->buff).length()
 numWritten = write(pipehandler, pcstr->buff, size);

每个pcstr-> buff是指向预配置大小为1-5 MB的malloc大小的指针

然而,写入管道所需的时间比填充pcstr-> buff(来自其他来源)要花费的时间太长而且它使我的程序运行得太慢。

有没有人知道更快的写作方法?

由于

1 个答案:

答案 0 :(得分:2)

  

每个pcstr-> buff是指向预配置大小为1-5 MB的malloc大小的指针

只需保存某处的长度。将其复制到std::string只是为了找出它的大小是相当浪费的。或者使用strlen()

  

然而,写入管道需要很长时间,而不是填充pcstr-> buff(来自其他来源)并且它使我的程序运行得太慢。

In Linux the default maximum pipe buffer size is 1Mb as of today。你提到你写了超过1Mb的管道。当发生这种情况时,写入线程会阻塞,直到管道中的某些数据被消耗掉。

  

有没有人知道更快的写作方法?

/dev/shm/tmp中使用普通文件。在最新的Linux上,/tmp是一个内存文件系统。但是,只有通过管道发送的数据量可以保存在文件中而不会溢出可用磁盘空间或内存量时,这才有效。