gpt4 book ai didi

c++ - 优化 I/O 绑定(bind)的 Win32 应用程序

转载 作者:行者123 更新时间:2023-11-30 04:10:57 24 4
gpt4 key购买 nike

我正在尝试优化 I/O 绑定(bind)的 C++ Win32 应用程序。它实际上做的事情非常类似于递归文件夹并计算它找到的每个文件的加密哈希。这是一个使用内存映射文件的单线程应用程序,因此很容易想象它似乎没有使用太多 CPU,因为大多数时候主线程处于 sleep 状态以等待 I/O 完成。我正在考虑几个解决方案,但我不确定,所以我想听听您的意见。

  1. 我可以产生很多线程(有一个固定大小的工作线程池以将内存使用量保持在一定阈值以下),但老实说我不知道​​这是否可以改善情况,每个线程都会进入休眠状态,就像我在当前实现中的主线程,加上调度程序会“浪费”大量计算能力来切换上下文。
  2. 我在考虑 I/O 完成端口(单线程?多线程?),但这意味着放弃内存映射文件(我错了吗?)并使用标准文件操作。如果是这种情况,能否请您提供一些示例代码,说明如何使用 IOCP 读取和详细说明给定的文件列表,而无需让读取线程进入休眠状态?

任何其他想法/建议/等将不胜感激:)

谢谢。

最佳答案

在并行化任何东西之前,总是先问问自己:增加的复杂性是否值得获得的性能?为了以最小的努力回答这个问题,只需测试您已经拥有的最大读取吞吐量的百分比。即测试你当前的读吞吐量,然后测试最大吞吐量。不要使用此计算的理论最大值。然后,想一想即使是最简单的方法来获得最后的几个百分比,也引入了多少复杂性和多少可能的问题。

正如评论中已经提到的,这里最大的性能提升可能是通过流水线实现的(即重叠计算和 I/O)。最简单的实现方法是使用异步读取。 This thread lists multiple ways to implement asnychronous file I/O in C++ .

如果您不需要便携性,只需使用 Windows OVERLAPPED API . Boost ASIO 似乎并没有使文件 I/O 变得非常容易(目前)。我找不到任何好的例子。

请注意,根据您的系统配置,您必须启动多个线程才能使 I/O 带宽完全饱和(特别是如果该文件夹的文件实际上驻留在多个磁盘上,这是可能的)。即使您只从一个设备读取数据,您也可以(稍微)更好地使用多个线程来减轻操作系统开销。

关于c++ - 优化 I/O 绑定(bind)的 Win32 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20389262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com