以下は、現在の char* から 16 進文字列への関数です。ビット操作の演習として書きました。AMD Athlon MP 2800+ で 1,000 万バイトの配列を 16 進数に変換するには、約 7 ミリ秒かかります。私が見逃しているトリックや他の方法はありますか?
どうすればこれをより速くすることができますか?
g++ で -O3 でコンパイル
static const char _hex2asciiU_value[256][2] =
{ {'0','0'}, {'0','1'}, /* snip..., */ {'F','E'},{'F','F'} };
std::string char_to_hex( const unsigned char* _pArray, unsigned int _len )
{
std::string str;
str.resize(_len*2);
char* pszHex = &str[0];
const unsigned char* pEnd = _pArray + _len;
clock_t stick, etick;
stick = clock();
for( const unsigned char* pChar = _pArray; pChar != pEnd; pChar++, pszHex += 2 ) {
pszHex[0] = _hex2asciiU_value[*pChar][0];
pszHex[1] = _hex2asciiU_value[*pChar][1];
}
etick = clock();
std::cout << "ticks to hexify " << etick - stick << std::endl;
return str;
}
アップデート
タイミングコードを追加
Brian R. Bondy : std::string をヒープに割り当てられたバッファに置き換え、 ofs*16 を ofs << 4 に変更します - ただし、ヒープに割り当てられたバッファは速度を落としているようですか? - 結果 ~11ms
Antti Sykäri : 内側のループを次のものに置き換えます
int upper = *pChar >> 4;
int lower = *pChar & 0x0f;
pszHex[0] = pHex[upper];
pszHex[1] = pHex[lower];
結果 ~8ms
Robert : 完全な 256 エントリのテーブルに置き換え_hex2asciiU_value
ます。メモリ スペースは犠牲になりますが、結果は最大 7 ミリ秒になります。
HoyHoy : 誤った結果が生成されていたことに注意