我在C ++中这样做:
if (myfile.is_open()){
while (! myfile.eof()){
getline (myfile,line);
DO STUFF
}
myfile.close();
}
else{
cout << "Unable to open file";
}
我正在尝试从文本文件中读取行并使用它执行操作。我试图看看算法的运行时间是多少。从文件读取行会减慢我的程序,所以我不会得到准确的结果吗?
答案 0 :(得分:1)
是 - 如果您想准确地对“DO STUFF”进行基准测试,那么您也不应该考虑磁盘IO。所以你可以做的一件事就是将整个文件缓冲到内存中,然后处理它并计算时间。但是如果文件太大或者会使你的行处理程序更加困难,你可以做的另一件事就是将文件逐行读入内存10次左右不进行处理,平均时间,然后按照你的方式计算函数的时间现在拥有它(包括处理和磁盘I / O),然后从总时间中减去平均磁盘读取时间。
编辑:我不知道为什么我之前没想过这个,但你也可以在执行“DO STUFF”时加上一个计时器,并在每次执行后添加一个总和。
答案 1 :(得分:1)
磁盘I / O时间变化很大,原因很多,包括转速,磁盘上的位置,碎片等。在很短的时间内访问文件两次通常会导致第二次访问完成得快得多首先。出于这些原因,您不应该在任何正式的bencharking测试中包含I / O速度。
您是否希望通过外部测量或使用本地时间累加器来衡量性能?如果你在外部做这件事,那你几乎搞砸了。如果您正在使用insturmentation,那么后处理器程序应该能够为您提供按方法分类,因此您可以简单地消除那些执行I / O的方法(假设您已经构建了代码来执行此操作) 。如果您正在使用本地累加器,只需将调用时间函数放在您感兴趣的主要块周围,然后让程序打印出最后的累加器。
答案 2 :(得分:1)
如果您想加快程序速度,请在每个I / O请求中读取更多数据。换句话说,不是一次读取一行,而是将1MB的数据读入缓冲区,并将文本行从缓冲区中取出。访问内部存储器总是比从文件读取更快。
如果您的文件位于硬盘驱动器上,另一种方法是经常读取以保持硬盘驱动器旋转。从文件读取的大部分开销都在等待硬盘驱动器加速。硬盘驱动器喜欢继续阅读,讨厌停止然后重新开始。这是基于运动中的物体倾向于保持运动。
还研究双缓冲。这种技术允许在处理器搜索另一个缓冲区时将数据读入一个缓冲区。
答案 3 :(得分:0)
从你粘贴的伪代码我假设你在文件的每一行都“做东西”。如果算法处理单行所需的时间长度远远长于从文件读取该行所需的时间,那么您可以忽略磁盘IO。在其他情况下,只需在运行算法之前将文件读入行向量,然后进行测量。
答案 4 :(得分:0)
while (! myfile.eof()){
getline (myfile,line);
...
不是读取文件的正确方法 - 您想要:
while ( getline (myfile,line) ){
...
有关为何如此的详细解释,您可能需要查看我的博客http://punchlet.wordpress.com/