diff options
| author | Mark Pulford <mark@kyne.com.au> | 2012-01-11 00:07:46 +1030 |
|---|---|---|
| committer | Mark Pulford <mark@kyne.com.au> | 2012-03-04 18:54:34 +1030 |
| commit | 3eee7e3db0ef209427f26be3099a0033deb86cb7 (patch) | |
| tree | dec80bc861ba6465931ef476c6819db806d9b5df | |
| parent | 418ee3fe24150c59c9afa6746aab7f09edcb894c (diff) | |
| download | lua-cjson-3eee7e3db0ef209427f26be3099a0033deb86cb7.tar.gz lua-cjson-3eee7e3db0ef209427f26be3099a0033deb86cb7.tar.bz2 lua-cjson-3eee7e3db0ef209427f26be3099a0033deb86cb7.zip | |
Use static strtod() buffer where possible
Use static strtod() buffer where possible to improve performance 5-10%
under locales with a comma decimal point.
| -rw-r--r-- | fpconv.c | 18 |
1 files changed, 13 insertions, 5 deletions
| @@ -81,6 +81,7 @@ static int strtod_buffer_size(const char *s) | |||
| 81 | * character. Guaranteed to be called at the start of any valid number in a string */ | 81 | * character. Guaranteed to be called at the start of any valid number in a string */ |
| 82 | double fpconv_strtod(const char *nptr, char **endptr) | 82 | double fpconv_strtod(const char *nptr, char **endptr) |
| 83 | { | 83 | { |
| 84 | char localbuf[FPCONV_G_FMT_BUFSIZE]; | ||
| 84 | char *buf, *endbuf, *dp; | 85 | char *buf, *endbuf, *dp; |
| 85 | int buflen; | 86 | int buflen; |
| 86 | double value; | 87 | double value; |
| @@ -97,10 +98,16 @@ double fpconv_strtod(const char *nptr, char **endptr) | |||
| 97 | } | 98 | } |
| 98 | 99 | ||
| 99 | /* Duplicate number into buffer */ | 100 | /* Duplicate number into buffer */ |
| 100 | buf = malloc(buflen + 1); | 101 | if (buflen >= FPCONV_G_FMT_BUFSIZE) { |
| 101 | if (!buf) { | 102 | /* Handle unusually large numbers */ |
| 102 | fprintf(stderr, "Out of memory"); | 103 | buf = malloc(buflen + 1); |
| 103 | abort(); | 104 | if (!buf) { |
| 105 | fprintf(stderr, "Out of memory"); | ||
| 106 | abort(); | ||
| 107 | } | ||
| 108 | } else { | ||
| 109 | /* This is the common case.. */ | ||
| 110 | buf = localbuf; | ||
| 104 | } | 111 | } |
| 105 | memcpy(buf, nptr, buflen); | 112 | memcpy(buf, nptr, buflen); |
| 106 | buf[buflen] = 0; | 113 | buf[buflen] = 0; |
| @@ -112,7 +119,8 @@ double fpconv_strtod(const char *nptr, char **endptr) | |||
| 112 | 119 | ||
| 113 | value = strtod(buf, &endbuf); | 120 | value = strtod(buf, &endbuf); |
| 114 | *endptr = (char *)&nptr[endbuf - buf]; | 121 | *endptr = (char *)&nptr[endbuf - buf]; |
| 115 | free(buf); | 122 | if (buflen >= FPCONV_G_FMT_BUFSIZE) |
| 123 | free(buf); | ||
| 116 | 124 | ||
| 117 | return value; | 125 | return value; |
| 118 | } | 126 | } |
