Mercurial > hg
comparison mercurial/parsers.c @ 19718:d69e06724b96
parsers: use a lookup table to convert hex to binary
This is a hotspot for parse_manifest. With this patch, for a 20 MB, 200,000
file manifest, parse_manifest goes down from 0.153 seconds to 0.116.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Sat, 07 Sep 2013 00:59:24 -0700 |
parents | 187bf2dde7c1 |
children | 5e25d71a58cc |
comparison
equal
deleted
inserted
replaced
19717:6031fe568cd0 | 19718:d69e06724b96 |
---|---|
12 #include <stddef.h> | 12 #include <stddef.h> |
13 #include <string.h> | 13 #include <string.h> |
14 | 14 |
15 #include "util.h" | 15 #include "util.h" |
16 | 16 |
17 static int8_t hextable[256] = { | |
18 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
19 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
20 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
21 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 0-9 */ | |
22 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* A-F */ | |
23 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
24 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* a-f */ | |
25 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
26 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
27 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
28 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
29 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
30 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
31 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
32 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
33 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 | |
34 }; | |
35 | |
17 static inline int hexdigit(const char *p, Py_ssize_t off) | 36 static inline int hexdigit(const char *p, Py_ssize_t off) |
18 { | 37 { |
19 char c = p[off]; | 38 int8_t val = hextable[(unsigned char)p[off]]; |
20 | 39 |
21 if (c >= '0' && c <= '9') | 40 if (val >= 0) { |
22 return c - '0'; | 41 return val; |
23 if (c >= 'a' && c <= 'f') | 42 } |
24 return c - 'a' + 10; | |
25 if (c >= 'A' && c <= 'F') | |
26 return c - 'A' + 10; | |
27 | 43 |
28 PyErr_SetString(PyExc_ValueError, "input contains non-hex character"); | 44 PyErr_SetString(PyExc_ValueError, "input contains non-hex character"); |
29 return 0; | 45 return 0; |
30 } | 46 } |
31 | 47 |