Какой шаблон чтения USB более эффективен: несколько чтений или одно большое чтение?

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

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

person Mojtaba Ahmadi    schedule 30.04.2019    source источник
comment
Исторически сложилось так, что для жестких дисков лучше всего было чтение и запись блоков размером с базовое оборудование, выровненных по границам блоков. Запись данных в часть аппаратного блока иногда требовала чтения всего этого блока, обновления буфера в памяти и обратной записи всего блока. Современное оборудование и программное обеспечение (драйвер устройства) прилагают все усилия, чтобы уменьшить накладные расходы, связанные с блоками.   -  person AdrianHHH    schedule 30.04.2019
comment
@AdrianHHH как насчет накладных расходов на ввод-вывод? накладные расходы ввода-вывода превышают накладные расходы на запись в память?   -  person Mojtaba Ahmadi    schedule 30.04.2019
comment
@AdrianHHH Запись данных в часть аппаратного блока иногда требовала чтения всего этого блока, обновления буфера в памяти и обратной записи всего блока. Это все еще требуется. Запишите четыре байта на диск, который использует блоки по 2048 байт, и весь блок придется читать, изменять и записывать обратно на диск. Современное оборудование и (драйверы устройств) программное обеспечение усердно работают над сокращением этих накладных расходов, связанных с блоками. И обычно они хорошо справляются со своей задачей, но если вы хотите запустить систему на проектных ограничениях или близко к ним, вы можете не абстрагироваться и не игнорировать фактический дизайн.   -  person Andrew Henle    schedule 02.05.2019
comment
Можете ли вы использовать mmap()?   -  person pmg    schedule 02.05.2019
comment
Эффективный в каком смысле? Задержка? Пропускная способность? Использование энергии? Износ USB-устройства?   -  person einpoklum    schedule 07.05.2019
comment
@einpoklum эффективность с точки зрения времени.   -  person Mojtaba Ahmadi    schedule 07.05.2019


Ответы (4)


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

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

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

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

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

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

person Frontear    schedule 06.05.2019

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

person Rudy Barbieri    schedule 02.05.2019

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

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

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

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

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

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

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

person Maxime B.    schedule 02.05.2019
comment
ОП не упоминал никаких дисков; В системе OP может даже не быть дисков. - person einpoklum; 07.05.2019
comment
@einpoklum Ой, я думал о USB, но я написал HDD. Это исправлено. - person Maxime B.; 07.05.2019

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

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

person Rob    schedule 07.05.2019