Ниже моя текущая функция char * to hex. Я написал это как упражнение в манипуляциях с битами. На AMD Athlon MP 2800+ требуется около 7 мс, чтобы зашифровать массив из 10 миллионов байт. Есть какой-то трюк или другой способ, который я пропускаю?
Как я могу сделать это быстрее?
Скомпилировано с -O3 в g ++
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 буфером кучи на распределении и измените с * 16 на of << 4 - однако выделенный из кучи буфер, кажется, замедляет его? - результат ~ 11мс </p>
Antti Sykäri : заменить внутренний цикл на
int upper = *pChar >> 4;
int lower = *pChar & 0x0f;
pszHex[0] = pHex[upper];
pszHex[1] = pHex[lower];
результат ~ 8мс
Роберт : замените _hex2asciiU_value
на полную таблицу из 256 записей, пожертвовав памятью, но в результате получите ~ 7 мс!
HoyHoy : заметил, что он дает неправильные результаты