Какой способ IO использовать?
Какой способ ввода-вывода использовать в современном коде? Насколько я понимаю, в стандартной библиотеке есть 3 способа: C-подобный, C++-потоки, C++-без потоков. Может есть ещё варианты (в т.ч. в сторонних библиотеках)? Если в разных ситуациях по-разному, то хотелось бы хотя бы по 1 примеру на каждый нестандартный способ.
Ответы (2 шт):
- Если скорость I/O крайне критична - лучше использовать не библиотечные вызовы, а системные вызовы той операционной системы, для которой пишется программа. Потому как, все библиотечные вызовы транслируются в системные вызовы. Возможно получится оптимизировать лучше (но и возможно сделать хуже, нельзя об этом забывать);
- Если скорость I/O несущественна - лучше использовать потоки, т.к. они наиболее удобны для программирования;
- Библиотечные С-подобные вызовы - это некоторая середина между п.1 и п.2, чуть медленнее системных вызовов, чуть быстрее потоков.
P.S. При программировании важно всегда помнить о грамотной настройке буферизации I/O, иначе результаты между методами будут сильно разниться. Буферизация же разницу по скоростям сильно уравнивает.
А иногда удобно использовать "отображение файлов в память". Есть свои плюсы и минусы.
Если читаете/пишете файл мелкими кусками, 100% нужна буферизация. Обычный C ввод-вывод норм, C++ надо смотреть, но может быть тоже норм. Если крупными кусками, то возможны варианты.
Если что-то сетевое-пакетное, то почти 100% лучше брать что даёт ось. На винде это может быть Alertable IO. В Linux - packet_mmap.
Потоки (которые threads, а не streams) всё это дело замедляют и усложняют. Использовать имеет смысл если приёмопередача сильно перемешана с процессорными вычислениями и однопоточный код либо выходит сложноват либо в одно ядро не влазит.