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

Reply via email to