【发布时间】:2013-06-14 19:08:44
【问题描述】:
我目前正在将数十亿的二进制记录写入 ASCII 文件(呃)。我的工作正常,但如果可以的话,我想优化性能。问题是,用户可以选择任意数量的字段来输出,所以我无法在编译时知道它们将包含 3-12 个字段中的哪一个。
有没有更快的方法来构造 ASCII 文本行?如您所见,字段的类型变化很大,我想不出绕过一系列 if() 语句的方法。输出的 ASCII 文件每条记录一行,所以我尝试使用由 arg 构造的模板 QString,但这只会减慢大约 15% 的速度。
更快的解决方案不必使用 QTextStream,也不必直接写入文件,但输出太大而无法将整个内容写入内存。
这里有一些示例代码:
QFile outfile(outpath);
if(!outfile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
{
qWarning("Could not open ASCII for writing!");
return false;
} else
{
/* compute XYZ precision */
int prec[3] = {0, 0, 0}; //these non-zero values are determined programmatically
/* set up the writer */
QTextStream out(&outfile);
out.setRealNumberNotation(QTextStream::FixedNotation);
out.setRealNumberPrecision(3);
QString del(config.delimiter); //the user chooses the delimiter character (comma, tab, etc) - using QChar is slower since it has to be promoted to QString anyway
/* write the header line */
out << "X" << del << "Y" << del << "Z";
if(config.fields & INTFIELD)
out << del << "IntegerField";
if(config.fields & DBLFIELD)
out << del << "DoubleField";
if(config.fields & INTFIELD2)
out << del << "IntegerField2";
if(config.fields & TRIPLEFIELD)
out << del << "Tri1" << del << "Tri2" << del << "Tri3";
out << "\n";
/* write out the points */
for(quint64 ptnum = 0; ptnum < numpoints; ++ptnum)
{
pt = points.at(ptnum);
out.setRealNumberPrecision(prec[0]);
out << pt->getXYZ(0);
out.setRealNumberPrecision(prec[1]);
out << del << pt->getXYZ(1);
out.setRealNumberPrecision(prec[2]);
out << del << pt->getXYZ(2);
out.setRealNumberPrecision(3);
if(config.fields & INTFIELD)
out << del << pt->getIntValue();
if(config.fields & DBLFIELD)
out << del << pt->getDoubleValue();
if(config.fields & INTFIELD2)
out << del << pt->getIntValue2();
if(config.fields & TRIPLEFIELD)
{
out << del << pt->getTriple(0);
out << del << pt->getTriple(1);
out << del << pt->getTriple(2);
}
out << "\n";
} //end for every point
outfile.close();
【问题讨论】:
-
您需要对您的应用程序进行分析,以找出减慢速度的原因。 Qt 类已经过优化,如果使用得当,可以快速运行。而且您的代码是正确的,我没有看到任何明显缓慢的地方。在您的情况下,确实需要进行分析。也许你的磁盘很慢,也许是 QTextStream,也许是 QString。
-
我还没有为 64 位窗口找到一个好的 Qt 分析器。 VerySleepy 有潜力,但它的输出是如此神秘,我几乎无法理解。有什么建议吗?
-
这取决于您使用的编译器。我喜欢 gprof 的 gcc。对于 MSVC 编译器,可以使用标准的 vsprofiler。
标签: qt optimization qt4