哪种 USB 读取模式更有效:多次读取还是一次大读取?

Which USB read pattern is more efficient: Multiple reads or one big read?

对于通过 USB 传输数据并将其写入内存以供进一步处理,哪个实现更有效(=最快):

  1. 从USB读取少量数据并多次写入内存。
  2. 正在从USB读取一大笔数据写入内存

RAM 访问总是 (*) 比真正的磁盘访问快...

时间取决于您的硬件,但对于少量数据,RAM 访问是 ns 的问题,而 USB 访问的范围从几十微秒到几毫秒不等。但这并不是 USB 特有的:RAM 访问比 SSD 访问更快。与 USB 访问相比更是如此。

另一个值得注意的有趣的事情是访问时间与数据大小不成正比。对于前兆字节尤其如此(部分原因是缓存)。因此,您一次阅读的内容越多,您的表现就越好。

最后,当您的数据存储在 RAM 中时,最常用的数据会被缓存,从而减少延迟时间。

因此,只要有可能,您应该立即读取数据并将其存储在RAM中以供后续访问。

(*) 此规则的唯一限制是您的 RAM 大小。如果您的计算机使用了比物理上更多的 RAM,额外的数据将被交换,也就是说,访问最少的数据将被传输到您的物理磁盘并在需要时检索。这显然会导致灾难性的表现。

总而言之,一次读取大量数据,但不要超过 RAM 中的 space 来存储它。一次读取超过 1G 不会显着提高性能,只会带来麻烦。

根据我的经验,最好从 USB 读取大量数据以减少 OS 的延迟。 很久以前,我正在编写一个应用程序,该应用程序必须以原始模式使用 USB 将数据写入设备。该设备使用一个 128 字节的数组来存储来自另一部分的数据(在我的例子中是 Windows)。当我增加设备部分的数据大小时,分配 1 MB space,我的性能得到了很大的提高

  1. reading a little data from USB and write on memory repeatedly multiple times.
  2. reading one huge data from USB and write it on memory.

您应该记住,内存引用总是最快。绝对没有竞争,但是,当涉及到内存时,始终在内存中保存一大块数据可能并不总是理想的。

在你的两个问题中,第二个选项不仅在快速访问方面而且在清洁方面都是最好的。它将显着减少 i/o 流式传输以获取数据的数量。

打开和关闭次数太多的问题,如果您选择第一个选项,这将是一个问题,导致磁盘阻塞,直到所有数据都可以刷新(每次关闭)。这不仅会损害磁盘缓存机制,而且 IO 会阻塞,直到它可以一遍又一遍地完成。这可能会导致更长的时间。

除非您绝对必须使用 1,否则 2 通常是更好的选择。然而,与往常一样,最好的检查方法是进行基准测试。对你有用的东西可能对其他人不起作用。

这个 Whosebug 讨论可能会让您感兴趣,它不是明确地关于 C(而是它的 C++),但是基本思想是相同的:Many small files or one big file? (Or, Overhead of opening and closing file handles) (C++)

这完全取决于您对性能的定义。如果你想尽快从 USB 中获取数据,一次大读取就可以了。

但是,一次大读取可能会导致错误或成为阻塞操作。通常进行多次小读取将允许您在发生错误时重试部分读取,并且还允许您在完成部分读取时更新 ui。