aboutsummaryrefslogtreecommitdiff
path: root/src/json.c
diff options
context:
space:
mode:
authordrh <>2023-12-28 19:18:08 +0000
committerdrh <>2023-12-28 19:18:08 +0000
commit4c13d3ca92d5214648cac9b5ae826deb7f5f16ff (patch)
tree2480c88aaeafe1e5583f2f22c9ba9986c5dfc090 /src/json.c
parent42203e1b757154b0eed44fec8843c8771c1d9a0b (diff)
downloadsqlite-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.c29
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);