【问题标题】:performace slows down when using QString::split function使用 QString::split 函数时性能会降低
【发布时间】:2017-08-18 15:58:56
【问题描述】:

有一个文本文件可能包含最多5*10^6 2D 点。

在对读取此文件的代码进行了一些实验测量和播放后,我发现瓶颈是我使用QString::split 函数将读取行分成多个部分,如下所示:

QString x, y; QStringList lineParts;   
while (!inputSream.atEnd())
{
    line = inputSream.readLine();
    if (line.size() > 0)
    {
        if (! line.contains("#"))
        {
        >>  lineParts = line.split(' ', QString::SkipEmptyParts);  //  performance go down by a almost ~2 seconds

            x = lineParts.at(0);
            y = lineParts.at(1);

            QPointF p;
            qreal yd = y.toDouble();
            p.setX(x.toDouble());
            p.setY(yd);

            if (yd < yRanges.first)
                yRanges.first = yd;      //  minY

            if (yd > yRanges.second)
                yRanges.second = yd;     //  maxY

            points.push_back(p);

        } else
        {
            headers.push_back(line);
        }
    }
}

如果没有这个功能,它读取文件的速度几乎快了 2 倍

为什么QString 拆分操作这么慢?

在不编写自己的拆分函数的情况下,如何提高此操作的性能?

附言

我正在考虑将整个文件读取与 2 个线程分开,其中一个线程将行读取到缓冲区并为对应的插槽发出文件读取完成信号,该插槽将对这些点执行一些其他操作。

但这对我来说听起来有点开销并且没有性能提升,因为它不会有太大差异,因为它仍然会执行同步操作,即:“当未读取该行时,它无法被解析”因此我认为最好更快地拆分字符串

【问题讨论】:

  • => 你应该配置文件。没有其他办法。

标签: c++ string performance optimization qt5


【解决方案1】:

如果你使用的是Qt5.4及以上,

使用“QString::splitRef”。这样会更快。

split 将子字符串的副本返回到Qstring 的列表中。这增加了内存分配的负担。

splitRef 将子字符串引用(仅限数据副本)返回到QStringRef 的向量中。这避免了内存分配的负担,因为只返回引用。

文档说:“此类(QStringRef)旨在提高处理从现有 QString 实例获得的子字符串时的子字符串处理性能。QStringRef 通过简单地引用来避免标准 QString 的内存分配和引用计数开销原始字符串的一部分。 "

http://doc.qt.io/qt-5/qstringref.html#details

注意:你应该小心原始字符串的生命或作用域。"只要这个字符串还活着,所有的引用都是有效的。销毁这个字符串会导致所有引用都是悬空指针。” http://doc.qt.io/qt-5/qstring.html#splitRef

【讨论】:

  • 是的,感谢您推荐此功能,它提供了 0.4 秒的一点加速,只是期待更多的性能提升
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2015-07-01
  • 2018-12-12
相关资源
最近更新 更多