Какой способ IO использовать?

146
26 июня 2022, 08:50

Какой способ ввода-вывода использовать в современном коде? Насколько я понимаю, в стандартной библиотеке есть 3 способа: C-подобный, C++-потоки, C++-без потоков. Может есть ещё варианты (в т.ч. в сторонних библиотеках)? Если в разных ситуациях по-разному, то хотелось бы хотя бы по 1 примеру на каждый нестандартный способ.

Answer 1
  1. Если скорость I/O крайне критична - лучше использовать не библиотечные вызовы, а системные вызовы той операционной системы, для которой пишется программа. Потому как, все библиотечные вызовы транслируются в системные вызовы. Возможно получится оптимизировать лучше (но и возможно сделать хуже, нельзя об этом забывать);
  2. Если скорость I/O несущественна - лучше использовать потоки, т.к. они наиболее удобны для программирования;
  3. Библиотечные С-подобные вызовы - это некоторая середина между п.1 и п.2, чуть медленнее системных вызовов, чуть быстрее потоков.

P.S. При программировании важно всегда помнить о грамотной настройке буферизации I/O, иначе результаты между методами будут сильно разниться. Буферизация же разницу по скоростям сильно уравнивает.

А иногда удобно использовать "отображение файлов в память". Есть свои плюсы и минусы.

Answer 2

Если читаете/пишете файл мелкими кусками, 100% нужна буферизация. Обычный C ввод-вывод норм, C++ надо смотреть, но может быть тоже норм. Если крупными кусками, то возможны варианты.

Если что-то сетевое-пакетное, то почти 100% лучше брать что даёт ось. На винде это может быть Alertable IO. В Linux - packet_mmap.

Потоки (которые threads, а не streams) всё это дело замедляют и усложняют. Использовать имеет смысл если приёмопередача сильно перемешана с процессорными вычислениями и однопоточный код либо выходит сложноват либо в одно ядро не влазит.

READ ALSO
Почему read() принимает количество байт с помощью знакового типа?

Почему read() принимает количество байт с помощью знакового типа?

std::ifstream::read(char_type*, std::streamsize) принимает количество читаемых байт с помощью знакового типа std::streamsize, а std::fread(void*, std::size_t, std::size_t, std::FILE*) -- с помощью...

90
Как исправить проблему с подключением bass dll к c++ builder?

Как исправить проблему с подключением bass dll к c++ builder?

Пытаюсь подключить bass dll к проекту в c++ builderСкачал архив с

143
C++ Таблица умножения

C++ Таблица умножения

Нужно сделать таблицу 12x12 , почему выводит только первую строку ? Если я сделал вложенный цикл?

140
Глобальное событие смены раскладки клавиатуры

Глобальное событие смены раскладки клавиатуры

Мне нужно знать, какая установлена раскладка клавиатуры пользователя в данный момент (использую в CALLBACK функции)

109