Какой шаблон чтения USB более эффективен: многократное чтение или одно большое чтение? - PullRequest
4 голосов
/ 30 апреля 2019

Какая реализация является более эффективной (= самой быстрой) для передачи данных через USB и записи ее в память для дальнейших процессов:

  1. чтение небольших данных с USB и многократная запись в память многократно.
  2. чтение огромных данных с USB и запись их в память.

Ответы [ 4 ]

4 голосов
/ 02 мая 2019

В моем опыте лучше читать много данных с USB, чтобы уменьшить задержку от ОС. Давным-давно я писал приложение, которое должно было записывать данные на устройство, используя USB в режиме raw. Устройство использовало массив из 128 байтов для хранения данных из другой части (в моем случае Windows). Когда я увеличил размер данных в части устройства, выделив 1 МБ пространства, я получил значительное увеличение производительности

2 голосов
/ 06 мая 2019
  1. чтение небольших данных с USB и многократная запись в память.
  2. чтение огромных данных с USB и запись их в память.

Вы должны помнить, что ссылка на память всегда самая быстрая.Конкуренции нет абсолютно никакой, однако, когда дело доходит до памяти, не всегда может быть идеальным всегда иметь кусок данных в памяти.

В ваших двух вопросах, который является лучшим дляне только быстрый доступ, но и за чистоту, второй вариант.Это значительно сократит объем потокового ввода-вывода для получения данных.

Проблема с открытием и закрытием слишком много раз, которая будет проблемой, если вы выберете первый вариант, заставляет диск блокироваться, пока все данные не будут сброшены (каждый раз, когда вы закрываете).Мало того, что это вредит механизмам кэширования диска, IO будет блокироваться до тех пор, пока не завершится снова и снова.Это может привести к еще более длительным временам.

Если только вам абсолютно не нужно использовать 1, обычно лучше выбрать 2.Как всегда, однако, лучший способ проверить это - тест.То, что работает для вас, может не сработать для кого-то другого.

Эта дискуссия о стековом потоке может вас заинтересовать, она явно не касается C (скорее, его C ++), однако основные идеи те же: Многие небольшие файлы илиодин большой файл?(Или, накладные расходы на открытие и закрытие файловых дескрипторов) (C ++)

2 голосов
/ 02 мая 2019

Доступ к ОЗУ всегда (*) быстрее, чем доступ к реальному диску ...

Время зависит от вашего оборудования, но для небольшого объема данных доступ к ОЗУ зависит от ns, а для USBдоступ может варьироваться от десятков мкс до миллисекунд.Это не относится к USB: доступ к ОЗУ быстрее, чем к SSD.Это еще более верно по сравнению с доступом через USB.

Еще одна интересная вещь, которую стоит отметить, это то, что время доступа не пропорционально размеру данных.Это особенно верно для первых мегабайт (частично из-за кэшей).Таким образом, чем больше вы сможете прочитать сразу, тем лучше будет ваша производительность.

Наконец, когда ваши данные хранятся в ОЗУ, наиболее часто используемые данные кэшируются, что приводит к еще меньшему времени задержки.

Поэтому, когда это возможно, вы должны читать данные сразу и сохранять их в ОЗУ для последующего доступа.

(*) Единственным ограничением для этого правила является размер вашей ОЗУ.Если ваш компьютер использует больше оперативной памяти, чем у него физически, дополнительные данные будут поменяться местами, то есть данные с наименьшим количеством обращений будут перенесены на ваш физический диск и извлечены при необходимости.Это, очевидно, приведет к катастрофическим результатам.

В заключение, прочитайте огромное количество сразу, но не больше, чем у вас есть место в оперативной памяти для его хранения.Чтение более 1 Гб за раз не приведет к значительному улучшению производительности и может только вызвать проблемы.

1 голос
/ 08 мая 2019

Все зависит от вашего определения производительности. Если вы хотите получить данные с usb как можно быстрее, одно большое чтение поможет вам.

Однако одно большое чтение может привести к ошибкам или блокированию. Часто выполнение нескольких небольших чтений позволит вам повторить частичное чтение при возникновении ошибки, а также позволит обновить пользовательский интерфейс после завершения частичного чтения.

...