我试图尽可能快地将十六进制字符转换为整数.
这只是一行:
int x = atoi(hex.c_str);
有更快的方法吗?
在这里,我已经尝试了一种更加动态的方法,它稍微快一些.
int hextoint(char number) { if (number == '0') { return 0; } if (number == '1') { return 1; } if (number == '2') { return 2; } /* * 3 through 8 */ if (number == '9') { return 9; } if (number == 'a') { return 10; } if (number == 'b') { return 11; } if (number == 'c') { return 12; } if (number == 'd') { return 13; } if (number == 'e') { return 14; } if (number == 'f') { return 15; } return -1; }
解决方法
提出比OP更快的解决方案if-else:
>无序地图查找表
如果您的输入字符串始终为十六进制数,则可以将查找表定义为unordered_map:
std::unordered_map<char,int> table { {'0',0},{'1',1},{'2',2},{'3',3},{'4',4},{'5',5},{'6',6},{'7',7},{'8',8},{'9',9},{'a',10},{'A',{'b',11},{'B',{'c',12},{'C',{'d',13},{'D',{'e',14},{'E',{'f',15},{'F',{'x',{'X',0}}; int hextoint(char number) { return table[(std::size_t)number]; }
或者如果您想要更快速的东西而不是unordered_map,您可以使用新的C 14工具与用户文字类型,并在编译时将表定义为文字类型:
struct Table { long long tab[128]; constexpr Table() : tab {} { tab['1'] = 1; tab['2'] = 2; tab['3'] = 3; tab['4'] = 4; tab['5'] = 5; tab['6'] = 6; tab['7'] = 7; tab['8'] = 8; tab['9'] = 9; tab['a'] = 10; tab['A'] = 10; tab['b'] = 11; tab['B'] = 11; tab['c'] = 12; tab['C'] = 12; tab['d'] = 13; tab['D'] = 13; tab['e'] = 14; tab['E'] = 14; tab['f'] = 15; tab['F'] = 15; } constexpr long long operator[](char const idx) const { return tab[(std::size_t) idx]; } } constexpr table; constexpr int hextoint(char number) { return table[(std::size_t)number]; }
基准:
我使用Nikos AthanasIoU编写的代码运行基准测试,该代码最近在isocpp.org发布,作为C微型基准测试的一种方法.
比较的算法有:
OP的原始if-else:
06002
2.由Christophe提出的紧凑型
06003
3.修正三进制运算符版本,处理大写字母输入,由g24l提出:
06004
4.查找表(unordered_map):
06005
其中table是先前显示的无序映射.
06005
实验设置
我定义了一个将输入十六进制字符串转换为整数的函数:
06007
06008
我创建了分别填充50000,100000,150000,200000和250000随机十六进制字符串的向量.然后对于每个算法,我运行100个实验并对时间结果进行平均.
编译器是GCC版本5.2,具有优化选项-O3.
结果:
讨论
从结果我们可以得出结论,对于这些实验设置,提出的表方法超出所有其他方法.尽管if-else方法胜过if-else方法,但是与其他提出的方法相比,if-else方法是最差的,因为它是unordered_map.
编辑:
stgatilov提出的方法的结果,按位操作:
06009
编辑:
060010
请注意,此方法不处理大写字母A,B,C,D,E和F.
结果:
仍然表方法呈现更快.