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 个线程分开,其中一个线程将行读取到缓冲区中,并为相应的插槽发出文件读取完成信号,该信号将使用这些点执行其他一些操作。
但这对我来说听起来像是一点开销并且没有性能提升,因为它不会有太大区别,因为它仍然会进行同步操作,即:“虽然未读取该行,但无法解析”因此我认为它更好更快地分割字符串
如果您使用的是 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
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |