0

我有一个可能需要 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 输出一些内容。

4

3 回答 3

3

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

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

于 2013-02-13T13:38:43.003 回答
2

目前还不清楚您要做什么。如果您发布的代码符合您的要求,那肯定是最好的解决方案。如果您想要附加的值,那么您可能希望保持文件打开。

其他一些考虑:

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

  • 当您打开文件时,任何具有该名称的现有文件都将被截断:此时尝试读取该文件的外部程序将看不到任何内容。

  • 每次输出后刷新(如果你使用自动std::endl),并在每次输出之前寻找开始,将解决前面的问题(如果数据看起来很小,写入将是原子的),但可能导致误导数据如果写入的值有不同的长度---文件长度 不会被缩短。(这里可能不是这种情况,但需要考虑一些事情。)

关于性能:您所说的操作最多持续几毫秒,并且每小时发生一次或两次。无论是一毫秒还是十毫秒,都完全无关紧要。

于 2013-02-13T14:57:50.403 回答
0

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

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

按照前面的答案建议分析您的应用程序,并使用它来识别代码中的真正瓶颈。

我能想到的唯一情况是,如果你想防止在info.txt应用程序运行时范围内被删除/编辑。在这种情况下,您希望保持流活着。否则没关系。

于 2013-02-13T14:58:21.637 回答