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

时间:2019-04-30 07:42:56

标签: c performance memory usb coding-efficiency

哪种方法效率更高(最快),可以通过USB传输数据并将其写入内存以进行进一步处理:

  1. 从USB读取少量数据并多次重复写入内存。
  2. 从USB读取一个巨大的数据并将其写入内存。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

RAM访问总是(*)快于实际磁盘访问...

时间取决于您的硬件,但是对于少量数据,RAM访问时间为ns左右,而USB访问的时间范围可以从数十微秒到毫秒。但是,这并不特定于USB:RAM访问比SSD访问更快。与USB存取相比,情况更是如此。

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

最后,当您的数据存储在RAM中时,最常用的数据将被缓存,从而导致更低的等待时间。

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

(*)此规则的唯一限制是RAM的大小。如果您的计算机使用的是其物理内存更多的RAM内存,则会交换额外的数据,即,访问最少的数据将被传输到您的物理磁盘并在需要时进行检索。这显然会导致灾难性的演出。

总而言之,一次读取大量内容,但最多只能在RAM中存储空间。一次读取超过1G不会显着提高性能,只会造成麻烦。

答案 2 :(得分:2)

  
      
  1. 从USB读取少量数据并多次重复写入内存。
  2.   
  3. 从USB读取一个巨大的数据并将其写入内存。
  4.   

您应该记住,拥有内存引用总是最快。绝对没有竞争,但是,在内存方面,始终在内存中存储大量数据可能并不总是理想的。

在您的两个问题中,第二个选项不仅对快速访问而且对于清洁性而言是最佳的。这将大大减少获取数据的I / O流的数量。

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

除非绝对必须使用1、2,否则通常是更好的选择。但是,一如既往,最好的检查方法是进行基准测试。适用于您的方法可能不适用于其他人。

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

答案 3 :(得分:1)

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

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