下面是我当前的 char* 到十六进制字符串函数。我把它写成一个位操作的练习。AMD Athlon MP 2800+ 需要大约 7 毫秒来对 1000 万字节数组进行 hexify。有什么我想念的技巧或其他方式吗?
我怎样才能让它更快?
在 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
int upper = *pChar >> 4;
int lower = *pChar & 0x0f;
pszHex[0] = pHex[upper];
pszHex[1] = pHex[lower];
结果~8ms
罗伯特:_hex2asciiU_value
用一个完整的 256 条目表替换,牺牲内存空间但结果 ~7ms!
HoyHoy:注意到它产生了不正确的结果