C ++ Записать в файл построчно в цикле или добавить в массив и записать в файл после цикла? - PullRequest
0 голосов
/ 14 мая 2018

Я разработал имитационную модель CFD, которая работает в основном в пределах одного цикла.

Существуют некоторые данные, которые необходимо выводить на каждом временном шаге, такие как сходимость и итерации в решателе линейной алгебры.

Какая лучшая практика для этого?В настоящее время у меня есть:

for(int tstep=0;tstep<maxTstep;++tstep)
{
    <code>
    outFile<<"data"<<endl;
{

Где строка записана в несколько файлов в конце каждого цикла.Лучше практиковать следующее:

for(int tstep=0;tstep<maxTstep;++tstep)
{
    <code>
    outputVector.push_back("data");
}
for(int i=0;i<outputVector.size();++i) outFile<<outputVector[i]<<endl;

При этом выходные данные добавляются в вектор, а затем записываются в файл за один раз?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Если «данные» относительно малы, то оба метода # 1 и # 2 будут иметь очень похожую производительность.

Если «данные» большие, например, несколько сотен байтов или более, то метод № 1 был бы предпочтительнее, поскольку он избегает выделения и копирования данных в outputVector (если это не требуется в любом случае).

0 голосов
/ 14 мая 2018

Единственный правильный ответ - измерить и сравнить оба подхода с настройками вашей производственной сборки. Интуитивно я не понимаю, почему подход vector был бы еще быстрее - я ожидаю, что он будет медленнее.

Вероятно, текущим узким местом является использование std::endl, которое заставляет любой буфер очищаться до места назначения. Замените его на \n и промывайте только один раз в конце - это должно дать вам значительное ускорение. Э.Г.

for(int tstep=0;tstep<maxTstep;++tstep)
{
    <code>
    outFile<<"data"<<'\n';
}

outFile.flush();
...