diff options
author | drh <> | 2023-12-02 14:16:47 +0000 |
---|---|---|
committer | drh <> | 2023-12-02 14:16:47 +0000 |
commit | f0b8b16317a0449d00d45246a2d78598e8322448 (patch) | |
tree | 366c238b81817fe29cbe80741b2e293d0d802c05 /src | |
parent | 679c90850c7df5b81aa43e5af30737748ea06954 (diff) | |
download | sqlite-f0b8b16317a0449d00d45246a2d78598e8322448.tar.gz sqlite-f0b8b16317a0449d00d45246a2d78598e8322448.zip |
Performance optimization in jsonAppendString().
FossilOrigin-Name: fdf00e96239c73fb67e2acecc5b95f55a1fc51c3deed4512613c0d6070ce5805
Diffstat (limited to 'src')
-rw-r--r-- | src/json.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/src/json.c b/src/json.c index af8f461d4..9d6554f41 100644 --- a/src/json.c +++ b/src/json.c @@ -595,17 +595,33 @@ static void jsonAppendSeparator(JsonString *p){ ** string. */ static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ - u32 i; - if( zIn==0 ) return; + u32 k; + u8 c; + const u8 *z = (const u8*)zIn; + if( z==0 ) return; if( (N+p->nUsed+2 >= p->nAlloc) && jsonStringGrow(p,N+2)!=0 ) return; p->zBuf[p->nUsed++] = '"'; - for(i=0; i<N; i++){ - unsigned char c = ((unsigned const char*)zIn)[i]; - if( jsonIsOk[c] ){ - p->zBuf[p->nUsed++] = c; - }else if( c=='"' || c=='\\' ){ + while( 1 /*exit-by-break*/ ){ + k = 0; + while( k<N-1 && jsonIsOk[z[k]] && jsonIsOk[z[k+1]] ){ k += 2; } + while( k<N && jsonIsOk[z[k]] ){ k++; } + if( k>=N ){ + if( k>0 ){ + memcpy(&p->zBuf[p->nUsed], z, k); + p->nUsed += k; + } + break; + } + if( k>0 ){ + memcpy(&p->zBuf[p->nUsed], z, k); + p->nUsed += k; + z += k; + N -= k; + } + c = z[0]; + if( c=='"' || c=='\\' ){ json_simple_escape: - if( (p->nUsed+N+3-i > p->nAlloc) && jsonStringGrow(p,N+3-i)!=0 ) return; + if( (p->nUsed+N+3 > p->nAlloc) && jsonStringGrow(p,N+3)!=0 ) return; p->zBuf[p->nUsed++] = '\\'; p->zBuf[p->nUsed++] = c; }else if( c=='\'' ){ @@ -626,7 +642,7 @@ static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ c = aSpecial[c]; goto json_simple_escape; } - if( (p->nUsed+N+7+i > p->nAlloc) && jsonStringGrow(p,N+7-i)!=0 ) return; + if( (p->nUsed+N+7 > p->nAlloc) && jsonStringGrow(p,N+7)!=0 ) return; p->zBuf[p->nUsed++] = '\\'; p->zBuf[p->nUsed++] = 'u'; p->zBuf[p->nUsed++] = '0'; @@ -634,6 +650,8 @@ static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ p->zBuf[p->nUsed++] = "0123456789abcdef"[c>>4]; p->zBuf[p->nUsed++] = "0123456789abcdef"[c&0xf]; } + z++; + N--; } p->zBuf[p->nUsed++] = '"'; assert( p->nUsed<p->nAlloc ); |