Как я могу обнаружить / контролировать уровень внутренней буферизации в C ++ fstream? - PullRequest
3 голосов
/ 09 декабря 2008

Скажите, что я делаю это (надуманный пример):

#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 выполняет здесь некоторую внутреннюю буферизацию и не превращает ее в миллиарды однобайтовых операций чтения файлов на уровне ОС.

Есть ли способ:

a) Определение размера внутреннего буфера ifstream?

b) Изменение размера внутреннего буфера ifstream?

Я пишу файловый фильтр, который должен читать файлы размером в несколько гигабайт небольшими порциями, и я хотел бы поэкспериментировать с различными размерами буфера, чтобы увидеть, влияет ли это на производительность.

1 Ответ

4 голосов
/ 09 декабря 2008

Вы можете использовать ios::rdbuf(), чтобы получить указатель на streambuf объект. Этот объект представляет внутренний буфер для потока.

Вы можете вызвать streambuf::pubsetbuf(char * s, streamsize n), чтобы установить новый внутренний буфер с заданным размером.

См. эту ссылку для более подробной информации.

edit: Вот как это будет выглядеть в вашем случае:


#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;
    }
}

edit: , на что указывает litb , фактическое поведение streambuf::pubsetbuf "определяется реализацией".

Если вы действительно хотите поэкспериментировать с буферами, вам, возможно, придется свернуть свой собственный класс буферизации, который наследуется от streambuf.

...