Запись производительности файла c++

Мне нужно написать файл на С++. Содержимое является токеном из цикла while, поэтому теперь я пишу его построчно. Теперь я думаю, что я могу улучшить время записи, сохранив все содержимое в переменной, а затем записать файл. Кто-нибудь знает, какой из двух способов лучше?

Каждая строка записывается этой функцией:

void writeFile(char* filename, string value){
        ofstream outFile(filename, ios::app);
        outFile << value;
        outFile.close();
}

while(/*    Something   */){
   /*   something   */
   writeFile(..);

}

Другой способ:

void writeNewFile(char* filename, string value){
    ofstream outFile(filename);
    outFile<<value;
    outFile.close();
}

string res = "";
while(/*    Something   */){
   /*   something   */
   res += mydata;

}
writeNewFile(filename, res);

person Carme    schedule 07.04.2016    source источник
comment
Скорость файлового ввода-вывода не так уж и проста, чтобы попытаться ее оптимизировать. Конечно, если ваша программа просто делает бессмысленные вещи, которые замедляют запись на диск (например, вызов sleep или что-то в этом роде), это одно. Но если вы написали код, который выглядит нормально, но по-прежнему имеет медленную запись на диск, возможно, ваш диск сам по себе медленный.   -  person PaulMcKenzie    schedule 07.04.2016


Ответы (3)


Вы рассмотрели;

ofstream outFile(filename);
while(/*    Something   */){
   /*...*/    
   outFile<< mydata;
}
outFile.close();

Внешний файл (потоки) буферизуются, что означает, что он будет накапливать данные во внутреннем буфере (например, в строке) перед записью на диск — вы вряд ли сможете превзойти это, если у вас нет особых требований.

person Soren    schedule 07.04.2016
comment
Вы, наверное, это знаете, но, строго говоря, близко — это лишнее. - person Werner Erasmus; 07.04.2016

В первом случае вы закрываете файловый поток на каждой итерации цикла и открываете новый поток, было бы лучше сделать что-то вроде:

void writeFile(const std::string& value, std::ostream* os = nullptr) {
    if (os != nullptr) {
        os << value;
    }
}

Or:

void writeFile(const std::string& value, std::ostream& os) {
    os << value;
}

А затем вызовите это с объектом fstream (или его адресом в первом случае), который вы создали в другой функции/главной/независимо.

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

person sjrowlinson    schedule 07.04.2016

Объекты fstream уже буферизованы, поэтому добавление к строке не сильно вам поможет, на самом деле можно даже потерять производительность в результате перераспределения содержимого строки при превышении ранее выделенного размера. Нужно было бы проверить, чтобы знать.

person Werner Erasmus    schedule 07.04.2016