【发布时间】:2010-09-09 07:21:34
【问题描述】:
下面是我当前的 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
替换内循环 int upper = *pChar >> 4;
int lower = *pChar & 0x0f;
pszHex[0] = pHex[upper];
pszHex[1] = pHex[lower];
结果 ~8ms
Robert:将_hex2asciiU_value 替换为完整的 256 项表,牺牲内存空间但结果约为 7ms!
HoyHoy: 注意到它产生了不正确的结果
【问题讨论】:
-
所写的功能似乎不再起作用
-
您可以使用我添加的 for 循环初始化您的 _hex2asciiU_value 数组。另外,我注意到我的答案有一个缺陷,我将提到的数组的长度指定为 255 而不是 256。
标签: c++ optimization hex