2016-04-13 65 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; 

不錯,很容易。總的來說,我逐字節讀取文件數據,直到我擊中表示分隔符的某些值,例如, 0x68 0x48。在這一點上,接下來我將介紹接下來的幾個字節,告訴我接下來是什麼類型的數據(浮點數,字符串,整數等),並根據需要進行提取。

因此,數據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); 
     } 
    } 
} 

一些本嵌入數據可能會被壓縮,所以我們使用

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); 

QDataStream的便利性使得它易於閱讀這些數據在映射到特定類型的同時也很容易處理永久性,但它似乎以犧牲速度爲代價。這些問題由於處理是遞歸的事實而變得複雜 - 讀取的數據本身可能包含嵌入式文件數據,這些數據需要以相同的方式讀取和處理。

是否有更快的選擇,如果以同樣的方式處理Endianess?

+1

「但它似乎是在犧牲速度」。看起來有些功能是以犧牲速度爲代價的?這似乎是一個?調查哪些代碼對速度變慢負責可能有意義嗎?這導致避免過早的優化,這是不好的。你可以做一些分析? – AlexanderVX

回答

1

你的代碼看起來直截了當..遞歸不應該是顯示塞...

你有大量的字符串?成千上萬?

stream >> string分配內存使用new什麼是真的很慢。然後需要手動釋放。請參閱Qt文檔中的operator>>(char *&s)方法。在讀入QStrings時使用它。

對於readBytes(char *&s, uint &l)也是如此,這可能被稱爲內部放緩一切!

QString本身也會分配內存(是使用16位編碼的兩倍),進一步減慢。

如果您經常使用這些功能之一,請考慮在進一步處理之前使用readRawData(char *s, int len)重寫該代碼部分,以便直接讀入預先分配的緩衝區。

總體而言,如果您需要高性能QDataStream本身可能會成爲展會的障礙。

+0

謝謝阿龍 - 那裏有一些有用的提示。 – TenG