【发布时间】:2016-10-05 14:05:06
【问题描述】:
我已经找到了一些与 Qt 和使用 C++ 编写文件有关的帖子,但是我没有找到现有方法的比较以及对“在 Qt 中编写文件的最快方法是什么?”这个问题的令人满意的答案。.. .
任务: 我需要将一大堆双精度值(大约 500.000 到 1.000.000)写入文件。由于我的程序结构,这些值保存在一个 QList 中,其中包含一些 QVector(每个 QVector 具有相同的大小)。 QVectors 包含双精度值。此外,每一列(每个 QList 元素都是一列)必须以不同的精度写入。每列用 \t 分隔。
我尝试了几种方法:
- QTextStream 到带有操作符 的 QFile
- 使用 QFile::write 直接写入 QFile
- 文件和fwrite
最后,我使用 fwrite 获得了 QTextStream 和 FILE 的最佳结果(几乎相同的速度),使用 QFile::write 的 QFile 稍微慢了一点(可能是 30%)。
但我仍然认为必须有更快的方法。对于 500.000 double 值,我的 PC (Core2Duo) 需要大约 2 秒,这相当长。
我还考虑过使用 Boost Karma C++ 库 - 你能推荐一下吗? http://www.boost.org/doc/libs/1_51_0/libs/spirit/doc/html/spirit/karma.html
【问题讨论】:
-
您绝对需要将它们写成文本吗?将双精度转换为文本是一个非常重要的瓶颈。
-
如果您真的关心性能,您可能应该首先将
QList和QVector替换为std::vector,因为QT 容器不可移动。如果这是不可能的,您至少应该将QList替换为QVector以获得更好的缓存行为。 -
附带说明,您可能需要考虑QSaveFile
-
@Corristo 那是不正确的。对齐方式和大小不大于
void*的类型的QList具有QVector的布局和性能。 Qt 容器当然是可移动的——自 Qt 5.2 以来,它们已经移动了将近 3 年!std::vector在这里没有性能优势。齐尔奇。 -
没有将值“写入”文件这样的事情:它太笼统而没有意义。您希望如何“写入”这些值?是二进制文件吗?一个文本文件?如果是文本文件,您是否正在并行化从浮点到文本的转换?等等。请给出一个完整的和最小的例子。
标签: c++ performance qt file