Предполагая, что есть некоторый фрагмент кода, который читает файлы для нескольких потребителей, и файлы имеют любой произвольный размер: При каком размере становится более эффективным читать файл асинхронно? Или, другими словами, насколько маленьким должен быть файл, чтобы он быстрее читался синхронно?
Я заметил (и, возможно, я ошибаюсь), что при чтении очень маленьких файлов их асинхронное чтение занимает больше времени, чем синхронного (в частности, в .NET). Я предполагаю, что это связано с настройкой времени для таких вещей, как порты завершения ввода-вывода, потоки и т. Д.
Есть ли здесь какое-то эмпирическое правило? Или это зависит от системы и окружающей среды?
efficiency
async
io
blesh
источник
источник
Ответы:
К сожалению, ответ «это зависит». Вам было бы легко написать небольшую программу, которая бы эмпирически определяла время как асинхронного, так и синхронизированного чтения.
Это будет зависеть от множества факторов. Они хранятся на вращающихся дисках, SSD или сетевом диске? Какой тип процессора вы используете? Сколько розеток / ядер? Вы работаете на виртуальной машине или голом металле? Вы используете древнюю ОС или современную?
источник
Async имеет 3 основных преимущества:
Я считаю, что главное преимущество асинхронного чтения - это когда вы работаете с большим количеством файлов или вам требуется много ресурсов процессора.
источник
blocked waiting for I/O
(0% CPU) наcontinue normal processing
(> 0% CPU).Это зависит
Нужно иметь в виду, насколько дорогим является переключение контекста между процессами. Node.JS спроектирован так, потому что он предполагает, что переключение контекста очень дорого, и в противном случае у вас будет много процессов, ожидающих в IE, что приведет к зависанию компьютера.
С другой стороны, Erlang делает переключение контекста процесса очень дешевым, поэтому все может быть синхронным, а время выполнения Erlang может отслеживать все это.
Итак, факторы, которые следует учитывать:
И я уверен, что я опускаю полдюжины факторов
источник
Я не уверен, что есть какая-то конкретная «точка», но это имеет смысл, когда у вас работает много потоков, поскольку это позволяет вам совмещать ваш ввод / вывод с другой работой. Если у вас есть свободные потоки, работающие вхолостую, то асинхронное чтение не даст вам никакого преимущества. Асинхронный доступ к файлу дает какое-то преимущество только тогда, когда у вас заполнены рабочие очереди и ваш поток может с пользой выполнять другую работу вместо ожидания ввода-вывода.
источник
Я думаю, что проблема здесь не столько в скорости чтения, сколько в задержке.
Если вы читаете с сетевого диска или с медленного механического жесткого диска с длинными очередями, производительность для чтения резко упадет. И если ваше приложение также выполняет чтение в потоке GUI, и в этом случае это очень плохое приложение, оно будет ужасным для пользователя.
источник