Как я могу обнаружить/контролировать уровень внутренней буферизации в fstream C++?
Вопрос
Скажем, я делаю это (надуманный пример):
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
ifstream ifs(argv[1]);
char ch;
while(ifs.read(&ch, 1)) {
cout << ch;
}
}
Я предполагаю (надеюсь), что библиотека iostream выполняет здесь некоторую внутреннюю буферизацию и не превращает это в миллионы операций чтения однобайтовых файлов на уровне ОС.
Есть ли способ:
а) Узнать размер внутреннего буфера ifstream?
б) Изменение размера внутреннего буфера ifstream?
Я пишу файловый фильтр, который должен читать файлы размером в несколько гигабайт небольшими порциями, и мне хотелось бы поэкспериментировать с разными размерами буфера, чтобы посмотреть, повлияет ли это на производительность.
Решение
Вы можете использовать ios::rdbuf()
чтобы получить указатель на streambuf
объект.Этот объект представляет внутренний буфер для потока.
Вы можете позвонить streambuf::pubsetbuf(char * s, streamsize n)
установить новый внутренний буфер заданного размера.
Видеть эта ссылка Больше подробностей.
редактировать: Вот как это будет выглядеть в вашем случае:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argCount, char ** argList[])
{
ifstream inStream(argList[1]);
char myBuffer [512];
inStream.rdbuf()->pubsetbuf(myBuffer, sizeof(myBuffer));
char ch;
while(inStream.read(&ch, 1))
{
cout << ch;
}
}
редактировать: как отметил литб, фактическое поведение streambuf::pubsetbuf
является «определяемым реализацией».
Если вы действительно хотите поиграть с буферами, вам, возможно, придется создать собственный класс буферизации, который наследуется от streambuf
.