Почему параллельное I/O медленнее? Выяснил, что нежелательно иметь более 1-го потока для Дискового i/o, не сетевого, а именно дискового. Вот, кстати, один из примеров: Почему параллельный Promise.all() на порядок медленнее, чем последовательные await'ы?. Погуглил - так и не нашёл развёрнутого ответа. Хотя и есть некоторые предположение почему это так работает, хотелось бы услышать авторитетное мнение или увидеть какую-нибудь ссылку.
Существует несколько причин, почему параллельное I/O может быть медленнее, чем последовательное.
Конкуренция за ресурсы: При параллельном выполнении нескольких операций I/O может возникнуть конфликт за доступ к общим ресурсам, таким как диск или сеть. Это может привести к задержкам из-за ожидания доступа к ресурсам другими потоками.
Контекстное переключение: Переключение контекста между потоками также требует времени и ресурсов процессора. Если задачи I/O часто переключаются между потоками, это может привести к дополнительным накладным расходам на обработку контекстного переключения.
Ограничения на скорость диска: Дисковые операции могут быть ограничены скоростью самого диска или интерфейса, поэтому параллельное выполнение не всегда может привести к увеличению производительности.
В случае с Promise.all() и await, параллельное выполнение Promise.all() может быть медленнее из-за того, что каждый промис в массиве запускается одновременно, что может привести к конфликтам за ресурсы и увеличению накладных расходов на контекстное переключение. С использованием await каждый промис запускается после завершения предыдущего, что может быть эффективнее для операций I/O.
Надеюсь, это дало вам более ясное представление о причинах медленной работы параллельного I/O. Возможно, стоит провести тесты производительности в конкретной ситуации, чтобы лучше понять, почему параллельное I/O медленнее в вашем случае.
Существует несколько причин, почему параллельное I/O может быть медленнее, чем последовательное.
Конкуренция за ресурсы: При параллельном выполнении нескольких операций I/O может возникнуть конфликт за доступ к общим ресурсам, таким как диск или сеть. Это может привести к задержкам из-за ожидания доступа к ресурсам другими потоками.
Контекстное переключение: Переключение контекста между потоками также требует времени и ресурсов процессора. Если задачи I/O часто переключаются между потоками, это может привести к дополнительным накладным расходам на обработку контекстного переключения.
Ограничения на скорость диска: Дисковые операции могут быть ограничены скоростью самого диска или интерфейса, поэтому параллельное выполнение не всегда может привести к увеличению производительности.
В случае с Promise.all() и await, параллельное выполнение Promise.all() может быть медленнее из-за того, что каждый промис в массиве запускается одновременно, что может привести к конфликтам за ресурсы и увеличению накладных расходов на контекстное переключение. С использованием await каждый промис запускается после завершения предыдущего, что может быть эффективнее для операций I/O.
Надеюсь, это дало вам более ясное представление о причинах медленной работы параллельного I/O. Возможно, стоит провести тесты производительности в конкретной ситуации, чтобы лучше понять, почему параллельное I/O медленнее в вашем случае.