私は、概要ではバイナリデータをafileから処理するプログラムを持っています。チューニングQDataStream
コード概要は以下のとおりです。
QFile fileIn ("the_file");
fileIn.open(QIODevice::ReadOnly);
ファイルはバイナリとテキストデータが混在しています。 ファイルの内容は、QDataStreamを使用して読み込まれます:
QDataStream stream(&fileIn);
stream.setByteOrder(QDataStream::LittleEndian);
stream.setVersion(QDataStream::Qt_5_0);
私は、さまざまなデータ型にQDataStreamからデータを読み取ることができます。例えば
QString the_value; // String
stream >> the_value;
qint32 the_num;
stream >> the_numm;
ニースで簡単です。全体的に私はデリミタを表す特定の値に達するまでファイルデータを1バイトずつ読み込みます。 0x68 0x48。この時点で次に私は次のデータのタイプ(float、Strings、intsなど)を教えてくれる次のバイトのカップルを取り出し、必要に応じて抽出します。
ので、データは同様に(輪郭)orocessedさ:
while (! stream.atEnd())
{
qint8 byte1 = getInt8(stream);
qint8 byte2 = getInt8(stream);
if (byte1 == 0x68 && byte2 == 0x48)
{
qint8 byte3 = getInt8(stream);
qint8 byte4 = getInt8(stream);
if (byte3 == 0x1 && byte4 == 0x7)
{
do_this(stream);
}
else if (byte3 == 0x2 && byte4 == 0x8)
{
do_that(stream);
}
}
}
この埋め込まれたデータの一部を圧縮することができるので、我々はQDataStreamの利便性を読み、それが容易になります
long dSize = 1024;
QByteArray dS = qUncompress(stream.device()->read(dSize));
QBuffer buffer;
buffer.setData(dS);
if (!buffer.open(QBuffer::ReadOnly)) {
qFatal("Buffer could not be opened. Something is very wrong!");
}
QDataStream stream2(&buffer);
stream2.setByteOrder(QDataStream::LittleEndian);
stream2.setVersion(QDataStream::Qt_5_0);
を使用特定のタイプへのマッピングだけでなく、エンディアンを容易に処理するという点ではデータがありますが、スピードを犠牲にしているようです。この問題は、処理が再帰的であるという事実が複合化されています。読み取られるデータ自体に埋め込みファイルデータが含まれている可能性があります。同じデータを読み込んで処理する必要があります。
もっと速い選択肢がありますか?その場合、どのようにエンディアンを同じように処理するのですか?
「しかし、スピードを犠牲にしているようです。いくつかの機能がスピードを犠牲にしているようですね?それは1つのようですか?おそらく、どのコードが遅い原因であるかを調べるのは理にかなっていますか?これは早すぎる最適化を避けることにつながり、これは悪いことです。いくつかのプロファイリングはできますか? – AlexanderVX