1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Reduce the CPU load imposed by sqlit3VdbeCursorMoveto() by factoring out

some of its functions and by avoiding unnecessary calls.

FossilOrigin-Name: c2799aece17d347c64217a0e407bb10e50c184a3
This commit is contained in:
drh
2014-10-13 16:02:20 +00:00
parent 6cf4a7dfa6
commit c22284f4b3
6 changed files with 43 additions and 21 deletions

View File

@@ -1,5 +1,5 @@
C Remove\sthe\sOPFLAG_CLEARCACHE\sflag\sfrom\sOP_Column.\s\sIn\sits\splace,\schange\sthe\nP3\sparameter\sof\sOP_SorterData\sto\sbe\sthe\sindex\sof\sthe\spseudo-table\scursor\swhose\nrecord\sheader\scache\sis\sto\sbe\scleared.\s\sThis\sgives\sa\ssmall\ssize\sreduction\nand\sperformance\sincrease. C Reduce\sthe\sCPU\sload\simposed\sby\ssqlit3VdbeCursorMoveto()\sby\sfactoring\sout\nsome\sof\sits\sfunctions\sand\sby\savoiding\sunnecessary\scalls.
D 2014-10-13T13:00:58.198 D 2014-10-13T16:02:20.134
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -172,7 +172,7 @@ F src/auth.c d8abcde53426275dab6243b441256fcd8ccbebb2
F src/backup.c a31809c65623cc41849b94d368917f8bb66e6a7e F src/backup.c a31809c65623cc41849b94d368917f8bb66e6a7e
F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
F src/btmutex.c 49ca66250c7dfa844a4d4cb8272b87420d27d3a5 F src/btmutex.c 49ca66250c7dfa844a4d4cb8272b87420d27d3a5
F src/btree.c 5c0b78c49d00da49a0e8e3d2738900a431df7fca F src/btree.c c9fcae8145436f728c61272cba72b1469c07f30d
F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8 F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8
F src/btreeInt.h 1bd7957161a1346a914f1f09231610e777a8e58d F src/btreeInt.h 1bd7957161a1346a914f1f09231610e777a8e58d
F src/build.c 9dc2bd94347b878c89627000c92b0c8d97ec2919 F src/build.c 9dc2bd94347b878c89627000c92b0c8d97ec2919
@@ -289,11 +289,11 @@ F src/update.c 729f6f18fc27740591d085e1172cebe311144bf0
F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
F src/util.c 4006c01772bd8d8ac4306d523bbcee41d3e392d8 F src/util.c 4006c01772bd8d8ac4306d523bbcee41d3e392d8
F src/vacuum.c 59f03f92bcff57faa6a8ca256eb29ccddfb0614a F src/vacuum.c 59f03f92bcff57faa6a8ca256eb29ccddfb0614a
F src/vdbe.c 6e07ea132d94b464fa9d28dd7ea85a977524de31 F src/vdbe.c cf7c24e531aad047689e4235a66b22526e765e46
F src/vdbe.h 09f5b4e3719fa454f252322b1cdab5cf1f361327 F src/vdbe.h 09f5b4e3719fa454f252322b1cdab5cf1f361327
F src/vdbeInt.h e1173bd72b282633c2ec8f3a2f78b5117229f268 F src/vdbeInt.h 90c0ae53382d16a4f77ad5a9c4b3e35278e9e061
F src/vdbeapi.c 37a6c6ae284a97bcace365f2f0a225680c0499d9 F src/vdbeapi.c 37a6c6ae284a97bcace365f2f0a225680c0499d9
F src/vdbeaux.c e223d15ab39c844c04ad19931e8c71966c20c68d F src/vdbeaux.c 8d101333912e33ed36201898d839cd560d8e87f4
F src/vdbeblob.c 848238dc73e93e48432991bb5651bf87d865eca4 F src/vdbeblob.c 848238dc73e93e48432991bb5651bf87d865eca4
F src/vdbemem.c 481327f50d9da330053aa7456702ce46d0a4e70f F src/vdbemem.c 481327f50d9da330053aa7456702ce46d0a4e70f
F src/vdbesort.c 5c1bacf90578d22b630fbf6ed98ccf60d83435ef F src/vdbesort.c 5c1bacf90578d22b630fbf6ed98ccf60d83435ef
@@ -1204,7 +1204,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P 91384a7d727ef0f285cd430e829ba9f3852db50e P 20062f49428a2349a2dd705af570c60b499a3eef
R 398856b8d4cf81a7bc85ff63a35b9f22 R a5158d9f69a4de7fce20f1a1e7deba5e
U drh U drh
Z cd7cdfd82fa519c77c73eb77000032e4 Z 9da431167b91f4974349edc450eddb7a

View File

@@ -1 +1 @@
20062f49428a2349a2dd705af570c60b499a3eef c2799aece17d347c64217a0e407bb10e50c184a3

View File

@@ -776,7 +776,7 @@ static int btreeRestoreCursorPosition(BtCursor *pCur){
** back to where it ought to be if this routine returns true. ** back to where it ought to be if this routine returns true.
*/ */
int sqlite3BtreeCursorHasMoved(BtCursor *pCur){ int sqlite3BtreeCursorHasMoved(BtCursor *pCur){
return pCur && pCur->eState!=CURSOR_VALID; return pCur->eState!=CURSOR_VALID;
} }
/* /*

View File

@@ -4313,16 +4313,20 @@ case OP_RowData: {
assert( pC->pseudoTableReg==0 ); assert( pC->pseudoTableReg==0 );
assert( pC->pCursor!=0 ); assert( pC->pCursor!=0 );
pCrsr = pC->pCursor; pCrsr = pC->pCursor;
assert( sqlite3BtreeCursorIsValid(pCrsr) );
/* The OP_RowKey and OP_RowData opcodes always follow OP_NotExists or /* The OP_RowKey and OP_RowData opcodes always follow OP_NotExists or
** OP_Rewind/Op_Next with no intervening instructions that might invalidate ** OP_Rewind/Op_Next with no intervening instructions that might invalidate
** the cursor. Hence the following sqlite3VdbeCursorMoveto() call is always ** the cursor. If this where not the case, on of the following assert()s
** a no-op and can never fail. But we leave it in place as a safety. ** would fail. Should this ever change (because of changes in the code
** generator) then the fix would be to insert a call to
** sqlite3VdbeCursorMoveto().
*/ */
assert( pC->deferredMoveto==0 ); assert( pC->deferredMoveto==0 );
assert( sqlite3BtreeCursorIsValid(pCrsr) );
#if 0 /* Not required due to the previous to assert() statements */
rc = sqlite3VdbeCursorMoveto(pC); rc = sqlite3VdbeCursorMoveto(pC);
if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error; if( rc!=SQLITE_OK ) goto abort_due_to_error;
#endif
if( pC->isTable==0 ){ if( pC->isTable==0 ){
assert( !pC->isTable ); assert( !pC->isTable );
@@ -4391,10 +4395,10 @@ case OP_Rowid: { /* out2-prerelease */
#endif /* SQLITE_OMIT_VIRTUALTABLE */ #endif /* SQLITE_OMIT_VIRTUALTABLE */
}else{ }else{
assert( pC->pCursor!=0 ); assert( pC->pCursor!=0 );
rc = sqlite3VdbeCursorMoveto(pC); rc = sqlite3VdbeCursorRestore(pC);
if( rc ) goto abort_due_to_error; if( rc ) goto abort_due_to_error;
rc = sqlite3BtreeKeySize(pC->pCursor, &v); rc = sqlite3BtreeKeySize(pC->pCursor, &v);
assert( rc==SQLITE_OK ); /* Always so because of CursorMoveto() above */ assert( rc==SQLITE_OK ); /* Always so because of CursorRestore() above */
} }
pOut->u.i = v; pOut->u.i = v;
break; break;
@@ -4752,10 +4756,16 @@ case OP_IdxRowid: { /* out2-prerelease */
pCrsr = pC->pCursor; pCrsr = pC->pCursor;
assert( pCrsr!=0 ); assert( pCrsr!=0 );
pOut->flags = MEM_Null; pOut->flags = MEM_Null;
rc = sqlite3VdbeCursorMoveto(pC);
if( NEVER(rc) ) goto abort_due_to_error;
assert( pC->deferredMoveto==0 );
assert( pC->isTable==0 ); assert( pC->isTable==0 );
assert( pC->deferredMoveto==0 );
/* sqlite3VbeCursorRestore() can only fail if the record has been deleted
** out from under the cursor. That will never happend for an IdxRowid
** opcode, hence the NEVER() arround the check of the return value.
*/
rc = sqlite3VdbeCursorRestore(pC);
if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
if( !pC->nullRow ){ if( !pC->nullRow ){
rowid = 0; /* Not needed. Only used to silence a warning. */ rowid = 0; /* Not needed. Only used to silence a warning. */
rc = sqlite3VdbeIdxRowid(db, pCrsr, &rowid); rc = sqlite3VdbeIdxRowid(db, pCrsr, &rowid);

View File

@@ -383,6 +383,7 @@ struct Vdbe {
void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*); void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*);
void sqliteVdbePopStack(Vdbe*,int); void sqliteVdbePopStack(Vdbe*,int);
int sqlite3VdbeCursorMoveto(VdbeCursor*); int sqlite3VdbeCursorMoveto(VdbeCursor*);
int sqlite3VdbeCursorRestore(VdbeCursor*);
#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) #if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
void sqlite3VdbePrintOp(FILE*, int, Op*); void sqlite3VdbePrintOp(FILE*, int, Op*);
#endif #endif

View File

@@ -2744,6 +2744,17 @@ static int SQLITE_NOINLINE handleMovedCursor(VdbeCursor *p){
return rc; return rc;
} }
/*
** Check to ensure that the cursor is valid. Restore the cursor
** if need be. Return any I/O error from the restore operation.
*/
int sqlite3VdbeCursorRestore(VdbeCursor *p){
if( sqlite3BtreeCursorHasMoved(p->pCursor) ){
return handleMovedCursor(p);
}
return SQLITE_OK;
}
/* /*
** Make sure the cursor p is ready to read or write the row to which it ** Make sure the cursor p is ready to read or write the row to which it
** was last positioned. Return an error code if an OOM fault or I/O error ** was last positioned. Return an error code if an OOM fault or I/O error
@@ -2761,7 +2772,7 @@ int sqlite3VdbeCursorMoveto(VdbeCursor *p){
if( p->deferredMoveto ){ if( p->deferredMoveto ){
return handleDeferredMoveto(p); return handleDeferredMoveto(p);
} }
if( sqlite3BtreeCursorHasMoved(p->pCursor) ){ if( p->pCursor && sqlite3BtreeCursorHasMoved(p->pCursor) ){
return handleMovedCursor(p); return handleMovedCursor(p);
} }
return SQLITE_OK; return SQLITE_OK;