以更快的方式覆盖?

时间:2017-10-16 01:30:48

标签: c++ c++11 ofstream

我正在尝试使用ofstream方法将一些文本写入文件,但是当我检查执行时间时,我可以看到,如果文件不存在,我的程序运行(平均)7秒,当文件存在时,它会在20秒内运行。

我还尝试删除并重新创建文件(如果存在)。这需要7秒我正在寻找。

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

以下代码是我用于创建文件流的代码:

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

我用这种方式编译了我的代码:

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

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

1 个答案:

答案 0 :(得分:0)

据我推测,最快的方法是单独执行删除和覆盖操作。这有两个原因:

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

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