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

Мне нужно написать файл на 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);

1

Решение

Рассматривали ли вы;

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

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

7

Другие решения

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

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

Или же:

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

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

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

2

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

0
По вопросам рекламы [email protected]