【问题标题】:Qt - Write Speed - What's the fastest method to write a file in Qt?Qt - 写入速度 - 在 Qt 中写入文件的最快方法是什么?
【发布时间】: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

【问题讨论】:

  • 您绝对需要将它们写成文本吗?将双精度转换为文本是一个非常重要的瓶颈。
  • 如果您真的关心性能,您可能应该首先将QListQVector 替换为std::vector,因为QT 容器不可移动。如果这是不可能的,您至少应该将QList 替换为QVector 以获得更好的缓存行为。
  • 附带说明,您可能需要考虑QSaveFile
  • @Corristo 那是不正确的。对齐方式和大小不大于void* 的类型的QList 具有QVector 的布局和性能。 Qt 容器当然是可移动的——自 Qt 5.2 以来,它们已经移动了将近 3 年! std::vector 在这里没有性能优势。齐尔奇。
  • 没有将值“写入”文件这样的事情:它太笼统而没有意义。您希望如何“写入”这些值?是二进制文件吗?一个文本文件?如果是文本文件,您是否正在并行化从浮点到文本的转换?等等。请给出一个完整的最小的例子。

标签: c++ performance qt file


【解决方案1】:

假设您按照下面的方式进行操作,您不太可能找到比 fwrite 更快的方法。

double values[1000] = {...};

fwrite(values, sizeof(double), 1000, f);

【讨论】:

  • 嗨,斯文,好的,我会试试这个,谢谢!我之前试过ofstream << setprecision << double-value;,它仍然比QTextStream慢。是否有可能使用 fwrite 格式化精度?
  • @johnymow 我认为您错过了最重要的部分:fwrite 按原样写入二进制数据,而不是将其写入文本。您的问题并未说明您为什么需要将数据作为文本。
  • 嗨,很抱歉耽搁了大约 1 年,我很忙,为我现在使用的程序找到了一个可行的解决方案。
  • @Kuba Ober:当然文件写入不是很具体。在我的公司,我们需要生成具有多列和大量行(10.000 - ~10.000.000 值)和每列的特定格式(精度、科学或浮点)的文本文件,以便在 Excel、Matlab、Origin 和与客户共享数据...
  • 我现在使用的仍然是一个 QList> 用于存储值。在大约 10 个程序中将其更改为另一种类型需要付出巨大的努力......假设有历史原因;-)。对于写作,我使用 snprintf 格式化双精度值并将它们存储在 char 数组中,用制表符或换行符分隔。对于写作,我使用 QFile::write(char*, ...) 效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多