diff options
author | drh <> | 2023-12-28 19:18:08 +0000 |
---|---|---|
committer | drh <> | 2023-12-28 19:18:08 +0000 |
commit | 4c13d3ca92d5214648cac9b5ae826deb7f5f16ff (patch) | |
tree | 2480c88aaeafe1e5583f2f22c9ba9986c5dfc090 /src/json.c | |
parent | 42203e1b757154b0eed44fec8843c8771c1d9a0b (diff) | |
download | sqlite-4c13d3ca92d5214648cac9b5ae826deb7f5f16ff.tar.gz sqlite-4c13d3ca92d5214648cac9b5ae826deb7f5f16ff.zip |
Performance improvement by unwinding a loop in jsonAppendString().
FossilOrigin-Name: 190ab3c08431a0ba24d76392eab251f5c1792add05e4ec780998b299208eca95
Diffstat (limited to 'src/json.c')
-rw-r--r-- | src/json.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/json.c b/src/json.c index 5f5440ec3..6ee51d39c 100644 --- a/src/json.c +++ b/src/json.c @@ -627,8 +627,33 @@ static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ p->zBuf[p->nUsed++] = '"'; while( 1 /*exit-by-break*/ ){ k = 0; - while( k+1<N && jsonIsOk[z[k]] && jsonIsOk[z[k+1]] ){ k += 2; } /* <--, */ - while( k<N && jsonIsOk[z[k]] ){ k++; } /* <-- loop unwound for speed */ + /* The following while() is the 4-way unwound equivalent of + ** + ** while( k<N && jsonIsOk[z[k]] ){ k++; } + */ + while( 1 /* Exit by break */ ){ + if( k+3>=N ){ + while( k<N && jsonIsOk[z[k]] ){ k++; } + break; + } + if( !jsonIsOk[z[k]] ){ + break; + } + if( !jsonIsOk[z[k+1]] ){ + k += 1; + break; + } + if( !jsonIsOk[z[k+2]] ){ + k += 2; + break; + } + if( !jsonIsOk[z[k+3]] ){ + k += 3; + break; + }else{ + k += 4; + } + } if( k>=N ){ if( k>0 ){ memcpy(&p->zBuf[p->nUsed], z, k); |