在计算密集型程序中正确使用流

proper use of stream in a computationally intensive program

本文关键字:计算 密集型 程序      更新时间:2023-10-16

我有一个程序可能需要3-4个小时才能完成。目前我需要将各种信息输出到一个通用文件"info.txt"中

char dateStr [9];
char timeStr [9];
_strdate(dateStr);
_strtime(timeStr);
ofstream infoFile("info.txt", ios::out);
infoFile << "foo @ " << timeStr << " , " << dateStr << endl;
infoFile.close();

我在一次跑步中做了五次。我的问题是:是否最合适(效率和标准)

  1. 在每次输出后关闭infoFile(因此,使用五个流infoFile1、infoFile2、…、infoFile5,每次输出一个)
  2. 或者只使用"infoFile",从而在整个运行过程中打开它

编辑:我所说的"一次运行"是指程序的一次运行。因此,所谓"一次运行五次",我的意思是,当运行一次程序时(需要3-4小时),我会向info.txt输出一些内容。

First;在优化之前获取数字,请使用探查器。然后你就知道哪些部分最耗时。如果你没有探查器,在做任何事情之前都要想一想。在这3-4小时里,你会跑多少次?如果每次运行只发生一次的事情很少,那么可能不太可能成为优化的好目标,如果是大量运行,那么这些部分也可以考虑,因为磁盘访问可能相当慢。

话虽如此,通过重用流而不是打开和关闭,我在以前的项目中节省了一些时间。

还不清楚你想做什么post可以随心所欲,这无疑是最好的解决方案。如果如果希望附加,则可能需要保留文件打开。

其他一些注意事项:

  • 除非关闭文件或刷新数据,否则外部程序可能不会立即看到数据。

  • 打开文件时,任何具有该名称的现有文件都将truncated:一个外部程序,它试图在正是这一刻什么也看不见。

  • 每次输出后冲洗(如果使用std::endl,则自动),并且在每次输出之前寻求开始,将解决以前的问题(如果数据看起来很小写入将是原子的),但如果写入的值具有不同的长度--文件长度将而不是缩短。(可能不是这是一个案例,但需要考虑。)

关于性能:你说的是手术它最多持续几毫秒,并且发生每小时一两次。无论需要一毫秒,还是十,完全无关。

这是过早优化的一个明显例子

您所采取的方法对应用程序的性能没有实际影响,因为在几个小时的时间内,这种情况只发生了5次。

按照前面的答案对您的应用程序进行评测,并使用它来识别代码中的REAL瓶颈。

我能想到的唯一一种情况是,如果您想防止info.txt在应用程序运行期间被删除/编辑,这对您来说很重要。在这种情况下,你会希望保持流的活力。否则没关系。