![]() |
1
6
如果您一次读取一个字节,那么您调用的每个字节都有调用函数来读取该字节的开销,以及额外的开销(例如,执行
如果读取4000个字节,则开销相同(在上面的示例中,一个函数调用,一个添加(fileposition+=4000),一个检查是否在文件末尾。所以,就日常开支而言,你刚刚使它快了4000倍。(事实上,还有其他成本,所以你不会看到大的收益,但你已经大幅削减了日常开支) 当然,您可以创建一个和整个文件一样大的缓冲区,并获得绝对最小的开销。然而:
通常,4Kb到128Kb之间的I/O缓冲区最适合大多数情况,您可以将其调到正在执行的特定操作,因此没有适合所有情况的“完美”大小。 请注意,在大多数I/O情况下,使用的缓冲区很多。例如,从磁盘复制数据时(简单地说),数据从磁盘读取到硬盘中的读缓存(缓冲区),然后通过接口电缆发送到计算机的驱动器控制器,该控制器也可以缓冲数据。然后,它可以通过一个I/O缓冲区传输到RAM中,在那里它被保存,直到程序准备好接收它为止(它甚至可能会在您请求之前提取数据,因为它期望您继续从同一个文件中读取数据,并尝试缓冲数据,这样您就不必等待它了)。然后将其读到缓冲区中并写入。然后它转到另一个I/O缓冲区,发送到驱动器控制器,传递到驱动器,并缓存在写缓存中。最终,硬盘将决定将数据实际存储在其写缓存中,并且您的拷贝将完成-大多数情况发生在后台,因此在程序认为它已完成写入并继续执行其他任务后的几秒钟内,它可能无法完成写入。(这就是在拔出USB驱动器之前必须“安全地取出”USB驱动器的原因-操作系统可能还没有将所有数据实际写入设备,甚至在计算机说您的复制操作完成后的几秒钟内) |
![]() |
2
4
您通常可以选择读写大小。然而,对于特定的体系结构,一些值将更为理想。我不知道这些是什么。我一直倾向于使用我熟悉的功能,比如4K(我用来写驱动程序的NT系统的页面大小)。但是我在用户模式下尝试过更大的尺寸,我从来没有遇到过任何问题。我尽量减少IO调用的次数。 我的建议是,这些天,如果块的大小非常相同(操作开销与获得的数量之比)或者非常大(IO系统阻塞和饱和),那么块的大小实际上只是非常重要的。 我认为在任何特殊情况下你都应该
|
![]() |
A B · C#Excel自动调整列避免长文本时出错 4 月前 |
![]() |
pseudodev · 失败的测试仅显示堆栈跟踪,不显示完整日志 4 月前 |
![]() |
CactusCake · if语句中应有分号 5 月前 |
![]() |
Bin4ry · 子文件夹中的应用程序设置 6 月前 |