C++ 为什么Unix IPC解决方案在自定义基准测试中的吞吐量性能会超过16 MiB?

C++ 为什么Unix IPC解决方案在自定义基准测试中的吞吐量性能会超过16 MiB?,c++,c,linux,unix,ipc,C++,C,Linux,Unix,Ipc,我想评估一些常见的IPC解决方案在Unix系统上的原始性能。作为起点,我创建了几个小型基准测试程序,旨在将二进制数据从分叉客户端发送到服务器(大小为1kib–512 MiB,每次迭代的大小是以前的两倍)。通过锁定两个进程上的时间戳,应该可以通过将数据大小除以经过的时间来估计吞吐量 一切似乎都正常,但我不明白为什么所有结果在16 MiB之后急剧下降,然后停滞不前,如下图所示: 为便于参考,缩写如下:uds(Unix域套接字)、fifo(fifo)、fifoenh(增强fifo=增加的本地和全局f

我想评估一些常见的IPC解决方案在Unix系统上的原始性能。作为起点,我创建了几个小型基准测试程序,旨在将二进制数据从分叉客户端发送到服务器(大小为1kib–512 MiB,每次迭代的大小是以前的两倍)。通过锁定两个进程上的时间戳,应该可以通过将数据大小除以经过的时间来估计吞吐量

一切似乎都正常,但我不明白为什么所有结果在16 MiB之后急剧下降,然后停滞不前,如下图所示:

为便于参考,缩写如下:uds(Unix域套接字)、fifo(fifo)、fifoenh(增强fifo=增加的本地和全局fifo大小)、mmap(POSIX共享内存)、tcp(tcp套接字)、mq(POSIX消息队列)、zmq ipc pr(ZeroMQ)

我附上了用于评估Unix域套接字吞吐量的示例程序(为了清楚起见,省略了错误检查)。所有其他人的工作方式类似:

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类型定义结构{
扫描电镜;
}迈森;
int main(int argc,char*argv[])
{
//安装日志文件
std::stringstream文件名;
文件名(0)
{
//父(服务器=读卡器)
文件名(sem);
socklen\u t addrlen=sizeof(结构sockaddr\u in);
int connFd=accept(sockFd,(结构sockaddr*)&udsAddr,&addrlen);
//从1kib到512 MiB
对于(int-szKiB=1;szKiB<1048576;szKiB=szKiB*2)
{
int szBytes=szKiB*1024;
//每种尺寸100次,达到平均值
对于(int i=0;i<100;i++)
{
//创建缓冲区
std::shared_ptr pBuf(新uint8_t[szBytes]);
uint32_t allBytesRead=0;
while(allBytesRead!=szBytes)
{
//read()阻塞,直到数据可用
uint32_t bytesRead=read(connFd,(void*)(pBuf.get()+allBytesRead),szBytes);
allBytesRead+=字节读取;
}
//读取后锁定当前时间
长时间戳=(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count());

日志文件停滞可能是由于缓存被填满,之后性能会受到SDRAM速度的限制——速度要慢得多。