C++ 写入管道的最快方法

C++ 写入管道的最快方法,c++,linux,pipe,fifo,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); 然后我一个接一个地向管道写

我编写了这个程序,其中一部分,线程获取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);
然后我一个接一个地向管道写入缓冲区,如下所示:

 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-5MB大小的malloc'ed大小

但是,写入管道比填充pcstr->buff(来自另一个源)花费的时间太长,这使得我的程序运行太慢

有没有人想到一种更快的写作方法

谢谢

每个pcstr->buff都是一个指针,指向预先配置的1-5MB大小的malloc'ed大小

把长度留到某个地方就行了。将其复制到std::string中,只是为了找出其大小是相当浪费的。或者使用
strlen()

然而,写入管道比填充pcstr->buff(来自另一个源)要花很长时间,这使得我的程序运行太慢

。您提到您在管道中写入了超过1Mb的数据。当这种情况发生时,写入线程阻塞,直到管道中的一些数据被消耗

有没有人想到一种更快的写作方法


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

是否有理由不知道
pcstr->buff
的大小(从而创建一个字符串来计算该大小)?@R.MartinhoFernandes是的…大小是从配置文件接收的,但您是否在谈论第三个参数?为什么不保存该大小,而不是反复计算它?
Write()
可能会阻塞,因为您的数据对于内核的管道缓冲区来说太大,所以它必须等待读取过程来耗尽它。您可能需要将流设置为非阻塞模式,并缓冲数据,以便在有空间时写入。我没有完全了解关于长度的第一部分…我确实提前知道了长度…这是我指定为malloc:-)的参数,因此它是固定的…我将检查关于最大文件大小的第二部分…听起来很有趣。谢谢:-)@user1432779:
string(pcstr->buff).length()
-这会复制缓冲区,返回字符串长度,然后销毁副本。改为使用strlen(pcstr->buff)。首先,我调用pcstr->buff=malloc(大小):-)时知道大小,所以我现在使用大小而不是strlen或length()。。我将大小更改为1MB,但它仍然没有像我预期的那样快地写入缓冲区:-(@user1432779:在旧Linux内核上,管道缓冲区大小为64Kb,如果内存允许的话。正如我所说,使用一个文件。@Maxim,它在您发送的手册页中说,可以在/proc/sys/中更改最大管道大小……这真的适用吗?