【问题标题】:How does a smaller pipe speed up data flow?较小的管道如何加速数据流?
【发布时间】:2010-08-10 02:21:35
【问题描述】:

有一个 1MB 的管道:

if (0 == CreatePipe(&hRead,&hWrite,0,1024*1024))
{
printf("CreatePipe failed\n");
return success;
}

一次发送 4000 个字节 (bytesReq = 4000)

while ((bytesReq = (FileSize - offset)) != 0)
{


//Send data to Decoder.cpp thread, converting to human readable CSV
        if ( (0 == WriteFile(hWrite,
                               readBuff,
                               bytesReq,
                               &bytesWritten,
                               0) ) || 
                               (bytesWritten != bytesReq) )
        {
             printf("WriteFile failed error = %d\n",GetLastError());
             break;
        } 

}  

Only 4 bytes at a time being read in at another thread, on other end of pipe.  

当我把管道做得更小时,发送和读取的总时间变小了很多。

将管道尺寸更改为 –
1024*1024 = 2 分钟(原始大小)
1024*512 = 1 分 47 秒
10,000 = 1 分 33 秒
任何低于 10k,1 分 33 秒

这怎么可能?

【问题讨论】:

  • 呸,if (0 == ...)? :P 至少让它if (... == 0) 让它读起来像普通语言。但是从整数类型到布尔类型的隐式转换无论如何都是b ? 1 : 0,所以根本不需要。

标签: c++ windows multithreading winapi pipe


【解决方案1】:

减少等待。

如果管道缓冲区太大,那么一个进程会写入所有数据并在第二个进程开始之前关闭它的管道末端。

当管道太大时,进程串行执行。

【讨论】:

  • @S.Lott:所以管道的读取端直到所有写入完成或管道已满才开始?我认为一旦管道中有可用数据,它就可以开始读取?
  • 可以,但它可能不会。在这种情况下,这是最合乎逻辑的解释。您的流程在时间上没有重叠。为什么不?读者必须在等待作者。为什么?因为读者没有被安排。为什么不?操作系统正在等待某个事件使阅读器能够运行。这是我的理论。
  • @S.Lott: 是的,确实如此,那很臭,我使用管道和螺纹的全部原因是时间重叠。
  • @Tommy:做实验吧。尝试不同尺寸的管道并测量性能。你会找到一个最佳的。知道这一点很重要。它需要是一个配置参数,因为不同的操作系统(以及操作系统的不同版本)可能有不同的调度规则。
  • @S.Lott:我似乎发现任何小于 1MB 的大小都发生在 1 分 33 秒的同一时间。我需要找出调度程序还基于什么。另外,较小的管道不会更串行,您提到当管道太大时,进程是串行执行的?怎么会这样?
猜你喜欢
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多