2014-05-24 89 views
3

我寫了一個函數將一些二進制數據的六進制字符串表示(如x00)轉換爲數據本身。對QByteArray轉換的Qt優化

如何提高此代碼?

QByteArray restoreData(const QByteArray &data, const QString prepender = "x") 
{ 
    QByteArray restoredData = data; 

    return QByteArray::fromHex(restoredData.replace(prepender, "")); 
} 

回答

1

如何提高此代碼?

優化之前的基準。不要做過早的優化。

超出要點:爲什麼要優化它? 1)如果你真的關心從性能角度來看這個可忽略的代碼很重要的性能,那麼你首先不會使用Qt,因爲Qt本質上比一個非常優化的框架要慢。 2)如果你不關心性能,那麼你應該把可讀性和維護作爲主要原則,在這種情況下你的代碼是好的。

您還沒有顯示任何真實世界的例子,您爲什麼想要優化。這感覺就像一個學術問題,沒有太多實際的用處。瞭解更多關於動機的信息會很有趣。這就是說,一些改進項目也是優化的,可以在你的代碼中完成,但是再次說明:它不是爲了優化而完成的,但更像是邏輯上的原因。

1)Prepender是壞名字;它通常在英語中被稱爲「前綴」。

2)您希望使用QChar而不是QString作爲角色。 3)同樣,對於替換,你希望使用''而不是''字符串''公式。

4)即使它是CoW(隱式共享),我會傳遞類似於引用的類,而不是值語義。

5)我甚至不會在這裏爲前綴使用參數,因爲它總是相同的,所以它不適合變量的定義。

6)不需要明確地創建臨時變量。

7)使函數內聯。

因此,你會寫這樣的事:

QByteArray restoreData(QByteArray data) 
{ 
    return QByteArray::fromHex(data.replace('x', '')); 
} 
+0

你也可以選擇要求方便'刪除(QChar則)'方法像QString的。這甚至會使代碼更具邏輯性,因爲您並未替換原則上的代碼。 – lpapp

1

由於replace(),您的代碼有性能問題。替換本身並不是很快,創建中間對象會使代碼更慢。如果您真的關心性能,可以從Qt源複製QByteArray::fromHex實現並根據需要對其進行修改。幸運的是,它的實現非常獨立。我只將/ 2更改爲/ 3並添加了--i行以跳過「x」個字符。

QByteArray myFromHex(const QByteArray &hexEncoded) 
{ 
    QByteArray res((hexEncoded.size() + 1)/ 3, Qt::Uninitialized); 
    uchar *result = (uchar *)res.data() + res.size(); 

    bool odd_digit = true; 
    for (int i = hexEncoded.size() - 1; i >= 0; --i) { 
     int ch = hexEncoded.at(i); 
     int tmp; 
     if (ch >= '0' && ch <= '9') 
      tmp = ch - '0'; 
     else if (ch >= 'a' && ch <= 'f') 
      tmp = ch - 'a' + 10; 
     else if (ch >= 'A' && ch <= 'F') 
      tmp = ch - 'A' + 10; 
     else 
      continue; 
     if (odd_digit) { 
      --result; 
      *result = tmp; 
      odd_digit = false; 
     } else { 
      *result |= tmp << 4; 
      odd_digit = true; 
      --i; 
     } 
    } 

    res.remove(0, result - (const uchar *)res.constData()); 
    return res; 
} 

測試:

qDebug() << QByteArray::fromHex("54455354"); // => "TEST" 
qDebug() << myFromHex("x54x45x53x54"); // => "TEST" 

此代碼可以意外行爲時hexEncoded格式不正確(.e.g 「x54x45x5」 將被轉換爲 「TU」)。如果這是一個問題,你可以解決這個問題。