【发布时间】: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