以更快的方式覆盖
Overwriting in a faster way?
我正在尝试使用 ofstream 方法将一些文本写入文件,但是当我检查执行时间时,我可以看到如果该文件不存在,我的程序运行(平均)7 秒,当文件存在时,它会在 20 秒内运行。
我还尝试删除并重新创建该文件(如果存在)。这需要我正在寻找的 7 秒。
在这里,我的问题是关于最快的方法,因此每当我重新运行代码时,平均时间都会再次约为 7 秒,而无需先删除文件?覆盖文件的额外时间的原因是什么?
以下代码是我用于创建文件流的代码:
// remove("mytextfile.txt");
writer.open("mytextfile.txt", ofstream::out);
我以这种方式编译了我的代码:
g++ -std=c++11 -pthread main.cpp -O3
(我的程序只在一个线程上运行)
根据我的推测,最快的方法是单独的删除和覆盖操作。这有两个原因:
-
截断文件(覆盖)和创建新文件的工作方式非常不同。 创建新文件时,应用程序只是为要驻留的文件分配一个新块。 截断时,它必须首先对文件末尾执行
fseek
,然后写入新块。(来源) -
C++等待文件描述符关闭,然后再完成磁盘操作。 如果在文件顶部触发文件删除,则实际的块级操作将与代码异步运行,然后执行新的写入。 如果使用截断,则应用程序必须等待文件被覆盖后才能写入,这是一种阻止操作。(来源)
相关文章:
- 如何在c++中为模板函数实例创建快捷方式
- 使用ios:ate写入到流会覆盖现有文件
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 创建引用向量的优雅方式
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我可以重新分配/覆盖std::字符串吗
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 不同/较旧的处理器运行c++代码的方式是否不同
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- 对运算符删除覆盖的工作方式感到困惑
- 在某些代码中覆盖方法的方式是什么?
- 以更快的方式覆盖
- 如何覆盖Qt中的默认快捷方式
- 以互斥的方式覆盖虚函数
- 如何以非内联方式定义模板覆盖的功能