2016-04-13 9 views
0

私は、概要ではバイナリデータを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

「しかし、スピードを犠牲にしているようです。いくつかの機能がスピードを犠牲にしているようですね?それは1つのようですか?おそらく、どのコードが遅い原因であるかを調べるのは理にかなっていますか?これは早すぎる最適化を避けることにつながり、これは悪いことです。いくつかのプロファイリングはできますか? – AlexanderVX

答えて

1

あなたのコードは、まっすぐ楽しみにしています。..再帰はショーストッパーではありません...

あなたは、文字列の多くを持っていますか?何千?

stream >> stringは、を使用してメモリを割り当てます。newは本当に遅いです。その後、手動でを解放する必要があります。operator>>(char *&s)メソッドのQtドキュメントを参照してください。これは、QStringを読み込むときに使用されます。

readBytes(char *&s, uint &l)と同じですが、これは内部的にすべての処理を遅くすることがあります。

QString自体もメモリを割り当てます(16ビットエンコーディングを使用する場合の2倍です)。

これらの機能のいずれかを頻繁に使用する場合は、後で処理する前に、readRawData(char *s, int len)を使用して事前割り当てバッファに直接読み込むコード部分を書き換えることを検討してください。

高性能が必要な場合は全体的に、QDataStream自体がショーストッパーになる可能性があります。

+0

Arronに感謝します - いくつかの有益なヒントがあります。 – TenG