- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在将数十亿条二进制记录写入 ASCII 文件(呃)。我已经一切正常,但如果可以的话,我想优化性能。问题是,用户可以选择任意数量的字段进行输出,因此我无法在编译时知道它们将包含 3-12 个字段中的哪一个。
有没有更快的方法来构造 ASCII 文本行?如您所见,字段的类型差异很大,我想不出解决一系列 if() 语句的方法。输出 ASCII 文件每条记录一行,所以我尝试使用模板 QString用 arg 构建,但这只会使速度减慢约 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();
最佳答案
(这不回答分析器问题。它试图回答原始问题,即性能问题。)
我建议在这种情况下完全避免使用 QTextStream 以查看是否有帮助。它可能有助于提高性能的原因是涉及开销,因为文本是 encoded internally to UTF-16用于存储,然后在写出时再次解码为 ASCII 或 UTF-8。您有两个不需要的转换。
尝试仅使用标准 C++ std::ostringstream
类代替。它与 QTextStream 非常相似,只需要在您的代码中进行细微的更改。例如:
#include <sstream>
// ...
QFile outfile(outpath);
if (!outfile.open(QIODevice::WriteOnly | QIODevice::Text
| QIODevice::Truncate))
{
qWarning("Could not open ASCII for writing!");
return false;
}
/* compute XYZ precision */
int prec[3] = {0, 0, 0};
std::ostringstream out;
out.precision(3);
std::fixed(out);
// I assume config.delimiter is a QChar.
char del = config.delimiter.toLatin1();
/* 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.precision(prec[0]);
out << pt->getXYZ(0);
out.precision(prec[1]);
out << del << pt->getXYZ(1);
out.precision(prec[2]);
out << del << pt->getXYZ(2);
out.precision(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";
// Write out the data and empty the stream.
outfile.write(out.str().data(), out.str().length());
out.str("");
}
outfile.close();
关于qt - 如何使用 QTextStream 优化 ASCII 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17115640/
我一直在玩一些 c++ hello world 的东西,并认为我会快速获得 qt 字符串。回显和转换字符串很好,但是 endl似乎很特别: #include int main(int, char*[
我想查看读取 QFile 的 QTextStream 的下一个字符,以创建一个高效的标记器。 但是,我没有找到任何令人满意的解决方案。 QFile f("test.txt"); f.open(QIOD
如何在标题中设置一个新的 QTextStream,就像这样 MainClass{ private: QTextStream out; } 然后,在初始化设置文件,而不是 QTextStream
我正在打开一个文件并获取它的 QTextStream。然后我使用 readLine() 逐行读取流。当该行与某个字符串匹配时,我需要将其替换为另一个字符串。我需要的行为是完全替换该行(即,如果该行是“
我正在学习 QtCreator,但在向文件中写入数据时遇到了问题。这是一些代码: char *str; int i = 1; QFile outFile("path/to/file/ou
我只是关注这个主题“How to print to console when using Qt”,以使我的应用程序正常运行。我开始怀疑 - 是否可以为单个 QTextStream 订阅更多输出?例如,
我尝试从同一个文件读取和写入,但出现奇怪的行为。这是示例代码: 主窗口.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include
我的问题很简单,但我无法解决... 在我的标题中: QTextStream *in = NULL; 在一种方法中,QTextStream 被初始化: in = new QTextStream(&fil
我在学习 Qt,使用 Qt5.1,我在重音方面有编码问题。我用葡萄牙语编写带有输出的程序,并且总是必须使用重音符号。该问题可以在以下代码中演示: \#include \#include \#inc
我正在为文本文件编写解析器,但 QTextStream 似乎缺少某些内容。我使用的是 Qt 5.4.1,代码是单线程的,如果这很重要的话。 这是方法: const Event* AviLogFile:
我有这几行代码: QFile file("h:/test.txt"); file.open(QFile::ReadOnly | QFile::Text); QTextStream in(&file);
我正在尝试使用 QTextStream 来格式化数字输出。我已将我的问题简化为一个小测试程序来演示我的问题。以下是我的代码: #include #include #include int mai
我的文件名中有空格,但由制表符分隔。我如何使用 QTextStream 一个一个地阅读它们? 正常的方式会被制表符和空格分割(实际上是任何 QChar::isSpace()),这不是我想要的: QSt
我正在使用以下代码将一些文本写入文件: QFile caFile(outputFolder + "file.extension"); caFile.open(QIODevice::WriteOnly
我想在 linux 机器上读取和解析/proc/PID/status 文件的内容,但 QTextStream.atEnd 在开始读取时总是返回 true。编码: QString procDirecto
我正在使用 QTextStream 将数据写入文件。它组织得很好(几乎完美),例如: i t y yy 0 0.016
我使用以下代码查找从 QFile 中读取的字节数。对于某些文件,它给出了正确的文件大小,但对于某些文件,它给出了一个近似于 fileCSV.size()/2 的值。我正在发送两个文件,其中的字符数相同
readLine()后,如何设置光标位置到行首? 使用 seek() 和 pos() 对我不起作用。 这是我的 file.txt 的样子: Object1 Some-name 2 3.40 1.50
我正在使用 QTextStream 写入 QFile,一切正常。我正在尝试创建一些错误检测,因此我尝试删除写入之间的输出文件。 扼杀,Qtextstream的状态继续显示0(无错误),QFile的er
我需要从 foo.txt 中读取字符串: #include #include #include #include int main( int argc, char** argv ) {
我是一名优秀的程序员,十分优秀!