Changeset: dcbfc2871c00 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/dcbfc2871c00 Modified Files: monetdb5/modules/atoms/blob.c Branch: Jan2022 Log Message:
Significantly improved parsing speed of blobs on Windows. On Windows, the isdigit and isxdigit macros are very expensive, so we avoid them. diffs (80 lines): diff --git a/monetdb5/modules/atoms/blob.c b/monetdb5/modules/atoms/blob.c --- a/monetdb5/modules/atoms/blob.c +++ b/monetdb5/modules/atoms/blob.c @@ -317,6 +317,41 @@ BLOBtostr(str *tostr, size_t *l, const v return (ssize_t) (s - *tostr); } +static const bool xdigit[256] = { + false,false,false,false,false,false,false,false, /* NUL-BEL */ + false,false,false,false,false,false,false,false, /* BS-SI */ + false,false,false,false,false,false,false,false, /* DLE-ETB */ + false,false,false,false,false,false,false,false, /* CAN-US */ + false,false,false,false,false,false,false,false, /* SPACE-'\'' */ + false,false,false,false,false,false,false,false, /* '('-'/' */ + true,true,true,true,true,true,true,true, /* '0'-'7' */ + true,true,false,false,false,false,false,false, /* '8'-'?' */ + false,true,true,true,true,true,true,false, /* '@'-'G' */ + false,false,false,false,false,false,false,false, /* 'H'-'O' */ + false,false,false,false,false,false,false,false, /* 'P'-'W' */ + false,false,false,false,false,false,false,false, /* 'X'-'_' */ + false,true,true,true,true,true,true,false, /* '`'-'g' */ + false,false,false,false,false,false,false,false, /* 'h'-'o' */ + false,false,false,false,false,false,false,false, /* 'p'-'w' */ + false,false,false,false,false,false,false,false, /* 'x'-DEL */ + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, + false,false,false,false,false,false,false,false, +}; + static ssize_t BLOBfromstr(const char *instr, size_t *l, void **VAL, bool external) { @@ -341,9 +376,14 @@ BLOBfromstr(const char *instr, size_t *l /* count hexits and check for hexits/space */ for (i = nitems = 0; instr[i]; i++) { - if (isxdigit((unsigned char) instr[i])) + if (xdigit[(unsigned char) instr[i]]) nitems++; - else if (!isspace((unsigned char) instr[i])) { + else if (instr[i] != ' ' && + instr[i] != '\n' && + instr[i] != '\t' && + instr[i] != '\r' && + instr[i] != '\f' && + instr[i] != '\v') { GDKerror("Illegal char in blob\n"); return -1; } @@ -372,7 +412,7 @@ BLOBfromstr(const char *instr, size_t *l char res = 0; for (;;) { - if (isdigit((unsigned char) *s)) { + if (*s >= '0' && *s <= '9') { res = *s - '0'; } else if (*s >= 'A' && *s <= 'F') { res = 10 + *s - 'A'; @@ -388,7 +428,7 @@ BLOBfromstr(const char *instr, size_t *l s++; res <<= 4; for (;;) { - if (isdigit((unsigned char) *s)) { + if (*s >= '0' && *s <= '9') { res += *s - '0'; } else if (*s >= 'A' && *s <= 'F') { res += 10 + *s - 'A'; _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org