在计算密集型程序中正确使用流
proper use of stream in a computationally intensive program
我有一个程序可能需要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();
我在一次跑步中做了五次。我的问题是:是否最合适(效率和标准)
- 在每次输出后关闭infoFile(因此,使用五个流infoFile1、infoFile2、…、infoFile5,每次输出一个)
- 或者只使用"infoFile",从而在整个运行过程中打开它
编辑:我所说的"一次运行"是指程序的一次运行。因此,所谓"一次运行五次",我的意思是,当运行一次程序时(需要3-4小时),我会向info.txt输出一些内容。
First;在优化之前获取数字,请使用探查器。然后你就知道哪些部分最耗时。如果你没有探查器,在做任何事情之前都要想一想。在这3-4小时里,你会跑多少次?如果每次运行只发生一次的事情很少,那么可能不太可能成为优化的好目标,如果是大量运行,那么这些部分也可以考虑,因为磁盘访问可能相当慢。
话虽如此,通过重用流而不是打开和关闭,我在以前的项目中节省了一些时间。
还不清楚你想做什么post可以随心所欲,这无疑是最好的解决方案。如果如果希望附加值,则可能需要保留文件打开。
其他一些注意事项:
-
除非关闭文件或刷新数据,否则外部程序可能不会立即看到数据。
-
打开文件时,任何具有该名称的现有文件都将truncated:一个外部程序,它试图在正是这一刻什么也看不见。
-
每次输出后冲洗(如果使用
std::endl
,则自动),并且在每次输出之前寻求开始,将解决以前的问题(如果数据看起来很小写入将是原子的),但如果写入的值具有不同的长度--文件长度将而不是缩短。(可能不是这是一个案例,但需要考虑。)
关于性能:你说的是手术它最多持续几毫秒,并且发生每小时一两次。无论需要一毫秒,还是十,完全无关。
这是过早优化的一个明显例子
您所采取的方法对应用程序的性能没有实际影响,因为在几个小时的时间内,这种情况只发生了5次。
按照前面的答案对您的应用程序进行评测,并使用它来识别代码中的REAL瓶颈。
我能想到的唯一一种情况是,如果您想防止info.txt
在应用程序运行期间被删除/编辑,这对您来说很重要。在这种情况下,你会希望保持流的活力。否则没关系。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 如何在C++中生成编译器不会删除的计算密集型代码
- 对于计算密集型函数,类函数参数是否比c++中的类变量更好?
- 数学密集型、基于计算的网站-我应该使用哪种语言
- 在计算密集型程序中正确使用流