首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序员思考过程:确定在Windows中使用ReadFile时要读取的最大字节数

程序员思考过程:确定在Windows中使用ReadFile时要读取的最大字节数
EN

Stack Overflow用户
提问于 2016-01-28 15:58:18
回答 2查看 183关注 0票数 6

我需要调用Windows的ReadFile函数:

代码语言:javascript
复制
BOOL WINAPI ReadFile(
  _In_        HANDLE       hFile,
  _Out_       LPVOID       lpBuffer,
  _In_        DWORD        nNumberOfBytesToRead,
  _Out_opt_   LPDWORD      lpNumberOfBytesRead,
  _Inout_opt_ LPOVERLAPPED lpOverlapped
);

我感兴趣的是第三个论点:

nNumberOfBytesToRead in 要读取的最大字节数。

我对放在那里的“魔术数字”不太感兴趣,但是经验丰富的程序员需要通过这个过程来确定要放在那里的数字,最好是按编号的步骤。

同时,请记住,我是用汇编语言编写程序的,所以我更感兴趣的是从这个角度来看我的思维过程。

EN

回答 2

Stack Overflow用户

发布于 2016-01-28 16:08:00

这需要对Windows和硬件都有足够的洞察力。但是,总的来说,以下是一些可能的方向:

  • 写是缓冲的还是未缓冲的?如果没有缓冲,那么您甚至可能无法选择大小,但必须对缓冲区的大小和对齐遵守严格的规则。
  • 一般来说,您可能希望让操作系统处理尽可能多的工作,因为它对存储设备本身及其不同用户的了解比在用户空间中要多得多。因此,如果可能的话,您可能希望立即获取整个事件(参见下面的要点)。
  • 如果结果证明这还不够好,您可以尝试通过各种大小的游戏来比它更聪明,以说明您可能能够使用当前缓冲区的情况,而由于某种原因,操作系统并不总是在不同的请求中使用这些缓冲区。
  • 否则,您可能会在磁盘扇区大小与页面大小倍数之间的任何地方使用大小,因为这些大小很可能已经缓存在某个地方,并且还可以直接映射到实际的硬件请求。
  • 除了性能之外,还有一个问题,即在任何给定的时间内,您可以在进程的内存中存储多少。
  • 还有一个问题是发送大请求,这可能会阻止其他进程获得进入那里的机会,并在两者之间获取一些数据--如果操作系统还没有在某种程度上解决这个问题。
  • 还有这样一种可能性,即通过请求太大的块,操作系统可能会推迟您的请求,直到其他进程得到它们卑微的请求。另一方面,如果它与地址相交,它可能首先服务于您的地址,以便为缓存中的其他地址提供服务。

一般来说,你可能会想在周围玩,直到你得到的东西工作得足够好。

票数 3
EN

Stack Overflow用户

发布于 2016-01-28 16:22:35

该参数的存在只是为了防止缓冲区溢出,因此您当然必须输入为此目的分配的缓冲区的大小。除此之外,您应该只读取您对这个确切时间感兴趣的字节数。现代操作系统将始终使用分页缓存,对文件的任何后续访问都将与访问RAM一样快。如果您需要整个文件,您还可以强制操作系统提前缓存文件。

编辑:我的经验是反对Yam Marcovic和其他人的建议。缓存文件和分块读取到理想的大小正是操作系统要做的事情。不要妄自尊大,只读你需要的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35066161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档