Шаг 524.
Библиотека STL. Ввод-вывод с использованием потоковых классов. Проблемы эффективности. Буферизация в потоковых буферах
На этом шаге мы рассмотрим особенности буферизации в потоковых буферах и приведем несколько рекомендаций по организации эффективной работы.
Буферизация ввода-вывода также является важным фактором эффективности. Системные вызовы обычно обходятся относительно дорого, поэтому их
количество должно быть по возможности сведено к минимуму. Тем не менее существует и другая, более тонкая причина для буферизации в потоковых
буферах C++ (по крайней мере, при вводе): функции форматного ввода-вывода работают с потоками данных при помощи итераторов
потоковых буферов, а операции с итераторами медленнее операций с указателями. Отличия не так уж велики, но вполне достаточны для того, чтобы
оправдать применение оптимизированных реализаций для частых операций (например, форматированного ввода числовых данных). Однако для этого
необходимо применение буферизации в потоковых буферах.
Итак, весь ввод-вывод осуществляется через потоковые буферы, обеспечивающие механизм буферизации. Но полагаться только на эту буферизацию
недостаточно по трем причинам.
- Потоки данных без буферизации часто реализуются проще. Если соответствующие потоки данных используются редко или только
для вывода (для вывода различия между итераторами и указателями не столь существенны, как для ввода; основная проблема - сравнение итераторов
потоковых буферов), вероятно, буферизация не играет особой роли. Но если потоковый буфер интенсивно используется, для него определенно следует
реализовать буферизацию.
- При установленном флаге unitbuf выходной поток данных очищает буфер после каждой операции вывода.
Кроме того, очистка производится манипуляторами flush и endl. Вероятно, для оптимального быстродействия следует избегать всех
трех способов. Но при выводе на консоль, например, было бы логично очищать буфер после вывода полных строк. Если вы зашли в тупик с
программой, интенсивно использующей манипуляторы unitbuf, flush и endl, рассмотрите возможность применения специального
потокового буфера, который в соответствующий момент вызывает не функцию sync(), а другую функцию.
- Связывание потоков данных функцией tie() (смотри 498 шаг) также требует дополнительных операций очистки потоков данных.
Следовательно, связывание должно применяться только при абсолютной необходимости. При разработке новых потоковых буферов рекомендуется
сначала реализовать их без буферизации. Если потоковый буфер окажется "узким местом" в работе системы, вы сможете организовать буферизацию
так, чтобы не затронуть другие компоненты приложения.
На следующем шаге мы рассмотрим непосредственную работу с потоковыми буферами.
Предыдущий шаг
Содержание
Следующий шаг