mirror of https://github.com/python/cpython
gh-121562: optimized hex_from_char (#121563)
Performance improvement to `float.fromhex`: use a lookup table for computing the hexadecimal value of a character, in place of the previous switch-case construct. Patch by Bruno Lima.
This commit is contained in:
parent
f6f4022a35
commit
04130b290b
|
@ -0,0 +1,2 @@
|
|||
Optimized performance of hex_from_char by replacing switch-case with a
|
||||
lookup table
|
|
@ -1142,69 +1142,39 @@ char_from_hex(int x)
|
|||
return Py_hexdigits[x];
|
||||
}
|
||||
|
||||
/* This table maps characters to their hexadecimal values, only
|
||||
* works with encodings whose lower half is ASCII (like UTF-8).
|
||||
* '0' maps to 0, ..., '9' maps to 9.
|
||||
* 'a' and 'A' map to 10, ..., 'f' and 'F' map to 15.
|
||||
* All other indices map to -1.
|
||||
*/
|
||||
static const int
|
||||
_CHAR_TO_HEX[256] = {
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
|
||||
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
};
|
||||
|
||||
/* Convert a character to its hexadecimal value, or -1 if it's not a
|
||||
* valid hexadecimal character, only works with encodings whose lower
|
||||
* half is ASCII (like UTF-8).
|
||||
*/
|
||||
static int
|
||||
hex_from_char(char c) {
|
||||
int x;
|
||||
switch(c) {
|
||||
case '0':
|
||||
x = 0;
|
||||
break;
|
||||
case '1':
|
||||
x = 1;
|
||||
break;
|
||||
case '2':
|
||||
x = 2;
|
||||
break;
|
||||
case '3':
|
||||
x = 3;
|
||||
break;
|
||||
case '4':
|
||||
x = 4;
|
||||
break;
|
||||
case '5':
|
||||
x = 5;
|
||||
break;
|
||||
case '6':
|
||||
x = 6;
|
||||
break;
|
||||
case '7':
|
||||
x = 7;
|
||||
break;
|
||||
case '8':
|
||||
x = 8;
|
||||
break;
|
||||
case '9':
|
||||
x = 9;
|
||||
break;
|
||||
case 'a':
|
||||
case 'A':
|
||||
x = 10;
|
||||
break;
|
||||
case 'b':
|
||||
case 'B':
|
||||
x = 11;
|
||||
break;
|
||||
case 'c':
|
||||
case 'C':
|
||||
x = 12;
|
||||
break;
|
||||
case 'd':
|
||||
case 'D':
|
||||
x = 13;
|
||||
break;
|
||||
case 'e':
|
||||
case 'E':
|
||||
x = 14;
|
||||
break;
|
||||
case 'f':
|
||||
case 'F':
|
||||
x = 15;
|
||||
break;
|
||||
default:
|
||||
x = -1;
|
||||
break;
|
||||
}
|
||||
return x;
|
||||
hex_from_char(unsigned char c) {
|
||||
return _CHAR_TO_HEX[c];
|
||||
}
|
||||
|
||||
/* convert a float to a hexadecimal string */
|
||||
|
|
Loading…
Reference in New Issue