关于C#:char []十六进制字符串练习

关于C#:char []十六进制字符串练习

char[] to hex string exercise

下面是我当前使用的char *到十六进制字符串的函数。我将其写为位操纵的练习。在AMD Athlon MP 2800上花费约7毫秒来十六进制一千万个字节的阵列。我有什么想念的技巧或其他方式吗?

如何使它更快?

用-O3 in g

编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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:用

替换内部循环

1
2
3
4
 int upper = *pChar >> 4;
 int lower = *pChar & 0x0f;
 pszHex[0] = pHex[upper];
 pszHex[1] = pHex[lower];

结果?8ms

Robert:用完整的256项表替换_hex2asciiU_value,牺牲了内存空间,但结果是?7ms!

HoyHoy:注意到它产生了不正确的结果


n


n


n


一次操作32位(4个字符),然后根据需要处理尾部。当我使用url编码进行此练习时,每个字符的全表查找都比逻辑结构快一点,因此您可能还想在上下文中进行测试以考虑缓存问题。


n


对于一个,而不是乘以16而不是bitshift << 4

也不要使用std::string,而是只在堆上创建一个缓冲区,然后delete。这将比字符串所需的对象销毁更有效率。


n


n


不会有太大的不同... * pChar-(ofs * 16)可以使用[* pCHar


n


n


n


n


n


n


n


推荐阅读

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    excel中乘法函数是什么?

    excel中乘法函数是什么?,乘法,函数,什么,打开表格,在C1单元格中输入“=A1*B1”乘法公式。以此类推到多个单元。1、A1*B1=C1的Excel乘法公式

    标准差excel用什么函数?

    标准差excel用什么函数?,函数,标准,什么,在数据单元格的下方输入l标准差公式函数公式“=STDEVPA(C2:C6)”。按下回车,求出标准公差值。详细

    字符库快捷键|字符串快捷键

    字符库快捷键|字符串快捷键,,1. 字符串快捷键1、单行注释单行注释是 #Mac的快捷键是 command+/windows的快捷键是 Ctrl + /2、多行注

    excel常用函数都有哪些?

    excel常用函数都有哪些?,函数,哪些,常用,1、SUM函数:SUM函数的作用是求和。函数公式为=sum()例如:统计一个单元格区域:=sum(A1:A10)  统计多个