使用 QString::split 函数时性能变慢

amp*_*awd 0 c++ string optimization performance qt5

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

在对读取此文件的代码进行了一些测试和播放后,我发现瓶颈在于我使用如下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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

在不编写自己的拆分函数的情况下,可以做些什么来提高此操作的性能?

ps

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

但这对我来说听起来像是一点开销并且没有性能提升,因为它不会有太大区别,因为它仍然会进行同步操作,即:“虽然未读取该行,但无法解析”因此我认为它更好更快地分割字符串

Pav*_*aka 5

如果您使用的是 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