2017-10-16 65 views
-1

我想写一些文本到一个文件,使用ofstream方法,但当我检查执行时间,我可以看到,如果该文件不存在,我的程序运行(平均)7秒,当文件存在,它在20秒内运行。以更快的方式覆盖?

我也尝试删除并重新创建文件,如果它存在。这需要7秒钟,我正在寻找。

在这里我的问题是关于最快的方式,以便每当我重新运行代码时,平均时间将再次约7秒,而不首先删除文件?额外的时间覆盖文件的原因是什么?

下面的代码是我用来创建文件流:

// remove("mytextfile.txt"); 
writer.open("mytextfile.txt", ofstream::out); 

我编我的代码是这样的:

g++ -std=c++11 -pthread main.cpp -O3 

(我的程序只在一个线程中运行)

+2

你能提供有关你在做什么一些更多的信息,像你使用的是什么操作系统和最小的代码示例,这将让我们重现错误? – templatetypedef

+0

首先,没有错误(如果我正确地得到了你)。我正在Ubuntu 16.04中编译和运行我的代码。我正在做的唯一事情是在文件中写入2.5 GB的字符(并且我的代码中有50兆字节的缓冲区,以获得更快的结果) – Behnam

+0

@templatetypedef这不是一个真正的错误 - 更多的是关于代码行为。你的评论真的不相关。 –

回答

0

从我的推测,最快的方法是做一个单独的删除和覆盖操作。这是由于两个原因:

  1. 截断文件(覆盖)和创建新文件的工作方式非常不同。创建新文件时,应用程序只是为文件分配一个新块。截断时,它必须首先执行fseek到文件末尾,然后写入新块。 (source

  2. C++在完成磁盘操作之前等待文件描述符关闭。如果在文件顶部触发文件删除操作,则实际的块级操作将与您的代码异步操作,然后执行新的写操作。如果使用截断,应用程序必须等待文件在写入之前被覆盖,这是一个阻塞操作。 (source