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

Performance improvements to the (debug-use only) Mem.pScopyFrom logic, resulting

in about 8x faster performance under -DSQLITE_DEBUG for the query in from
[forum:/forumpost/0025389d0860af82|forum post 0025389d0860af82].  This change
only affects builds that use -DSQLITE_DEBUG.

FossilOrigin-Name: 7fb1ae25d1572dd7709a0f850c148a5f745a524f01ea231e29a1ebc37c173fb9
This commit is contained in:
drh
2025-01-21 16:30:55 +00:00
parent 2e899ccaff
commit 8e7a16895c
7 changed files with 39 additions and 30 deletions

View File

@@ -1,5 +1,5 @@
C The\sFuncDev.nArg\sfield\svalues\s-3\sand\s-4\snow\shave\sspecial\smeansing\sof\s1\sor\smore\nor\s2\sor\smore\sarguments,\srespectively.\s\sThis\ssaves\sspace\sin\sthe\sbuilt-in\nfunction\stable,\sresulting\sin\sslightly\sfaster\sperformance\sand\sa\sreduced\sbinary\nsize. C Performance\simprovements\sto\sthe\s(debug-use\sonly)\sMem.pScopyFrom\slogic,\sresulting\nin\sabout\s8x\sfaster\sperformance\sunder\s-DSQLITE_DEBUG\sfor\sthe\squery\sin\sfrom\n[forum:/forumpost/0025389d0860af82|forum\spost\s0025389d0860af82].\s\sThis\schange\nonly\saffects\sbuilds\sthat\suse\s-DSQLITE_DEBUG.
D 2025-01-21T15:12:00.408 D 2025-01-21T16:30:55.694
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -848,13 +848,13 @@ F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba
F src/util.c e5f6a5eeaa26b69054a43bbd0048cfe3d2851f6961052b35aed8f695df922850 F src/util.c e5f6a5eeaa26b69054a43bbd0048cfe3d2851f6961052b35aed8f695df922850
F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40 F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40
F src/vdbe.c 8a6eb02823b424b273614bae41579392a5c495424592b60423dd2c443a583df0 F src/vdbe.c b428a751953c0c2ff85e3e152ec16e29d488895cd541c8c20876ff9f3bf6978a
F src/vdbe.h 9676348d342bd04e21e384c63b57224171ce84fac77853357334ef94c4d33cf4 F src/vdbe.h 9676348d342bd04e21e384c63b57224171ce84fac77853357334ef94c4d33cf4
F src/vdbeInt.h bf294a0c8fc4cc80779e74b04b8bd82c6e1197b3137cefe0b16cdf002fc7dfd6 F src/vdbeInt.h 895b1ab7536f018d3d70d690f6c0adbd1062b6dddce1c2cad912927856d4033c
F src/vdbeapi.c 033decc098df353b97a5ca14302ad812e2567f1037747c2d5fcda62aac1bb74e F src/vdbeapi.c 76fa76b21f46afc70e71ecd69954f601e9b80b5fb0c1eb7ace06d30802255768
F src/vdbeaux.c 5fcbc642a3d3d88c5ea15cadf2c8b8e4e067cb9ff374beb1875c9d209001299e F src/vdbeaux.c 885e16100597507fbbe09d82cbb963bff3fd8a9c1e358dc4f463fc95feb18e8b
F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797 F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797
F src/vdbemem.c df568ef0187e4be2788c35174f6d9b8566ab9475f9aff2d73907ed05aa5684b2 F src/vdbemem.c 977438546df236c6a3e7d8b4fe86c0643c13b89b00235db1f11c3a91a4796d30
F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f
F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
@@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P f418350f3f83147bc5817a885be6e39ff9ff5722742a88d17600729c53c65010 P 753fd747f24c5e9a019eb00b8a4f66e65c6733ba10a7adbd1b55786867c32ca6
R 214f345108f048affd4b7abd9f2ea035 R f2e8145ad0d67966271c1c923a7301c7
U drh U drh
Z b46d6184b5d599a41424bec3e41b4c80 Z 86ef734f24e1aa297cb586202f4cb17a
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
753fd747f24c5e9a019eb00b8a4f66e65c6733ba10a7adbd1b55786867c32ca6 7fb1ae25d1572dd7709a0f850c148a5f745a524f01ea231e29a1ebc37c173fb9

View File

@@ -607,6 +607,7 @@ static void registerTrace(int iReg, Mem *p){
printf("R[%d] = ", iReg); printf("R[%d] = ", iReg);
memTracePrint(p); memTracePrint(p);
if( p->pScopyFrom ){ if( p->pScopyFrom ){
assert( p->pScopyFrom->bScopy );
printf(" <== R[%d]", (int)(p->pScopyFrom - &p[-iReg])); printf(" <== R[%d]", (int)(p->pScopyFrom - &p[-iReg]));
} }
printf("\n"); printf("\n");
@@ -1590,6 +1591,7 @@ case OP_Move: {
{ int i; { int i;
for(i=1; i<p->nMem; i++){ for(i=1; i<p->nMem; i++){
if( aMem[i].pScopyFrom==pIn1 ){ if( aMem[i].pScopyFrom==pIn1 ){
assert( aMem[i].bScopy );
aMem[i].pScopyFrom = pOut; aMem[i].pScopyFrom = pOut;
} }
} }
@@ -1662,6 +1664,7 @@ case OP_SCopy: { /* out2 */
#ifdef SQLITE_DEBUG #ifdef SQLITE_DEBUG
pOut->pScopyFrom = pIn1; pOut->pScopyFrom = pIn1;
pOut->mScopyFlags = pIn1->flags; pOut->mScopyFlags = pIn1->flags;
pIn1->bScopy = 1;
#endif #endif
break; break;
} }

View File

@@ -244,6 +244,7 @@ struct sqlite3_value {
#ifdef SQLITE_DEBUG #ifdef SQLITE_DEBUG
Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */ Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */
u16 mScopyFlags; /* flags value immediately after the shallow copy */ u16 mScopyFlags; /* flags value immediately after the shallow copy */
u8 bScopy; /* The pScopyFrom of some other Mem *might* point here */
#endif #endif
}; };

View File

@@ -1294,6 +1294,7 @@ static const Mem *columnNullValue(void){
#ifdef SQLITE_DEBUG #ifdef SQLITE_DEBUG
/* .pScopyFrom = */ (Mem*)0, /* .pScopyFrom = */ (Mem*)0,
/* .mScopyFlags= */ 0, /* .mScopyFlags= */ 0,
/* .bScopy = */ 0,
#endif #endif
}; };
return &nullMem; return &nullMem;

View File

@@ -2152,6 +2152,7 @@ static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){
p->szMalloc = 0; p->szMalloc = 0;
#ifdef SQLITE_DEBUG #ifdef SQLITE_DEBUG
p->pScopyFrom = 0; p->pScopyFrom = 0;
p->bScopy = 0;
#endif #endif
p++; p++;
}while( (--N)>0 ); }while( (--N)>0 );

View File

@@ -1046,27 +1046,30 @@ int sqlite3VdbeMemTooBig(Mem *p){
void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){
int i; int i;
Mem *pX; Mem *pX;
for(i=1, pX=pVdbe->aMem+1; i<pVdbe->nMem; i++, pX++){ if( pMem->bScopy ){
if( pX->pScopyFrom==pMem ){ for(i=1, pX=pVdbe->aMem+1; i<pVdbe->nMem; i++, pX++){
u16 mFlags; if( pX->pScopyFrom==pMem ){
if( pVdbe->db->flags & SQLITE_VdbeTrace ){ u16 mFlags;
sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", if( pVdbe->db->flags & SQLITE_VdbeTrace ){
(int)(pX - pVdbe->aMem), (int)(pMem - pVdbe->aMem)); sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n",
(int)(pX - pVdbe->aMem), (int)(pMem - pVdbe->aMem));
}
/* If pX is marked as a shallow copy of pMem, then try to verify that
** no significant changes have been made to pX since the OP_SCopy.
** A significant change would indicated a missed call to this
** function for pX. Minor changes, such as adding or removing a
** dual type, are allowed, as long as the underlying value is the
** same. */
mFlags = pMem->flags & pX->flags & pX->mScopyFlags;
assert( (mFlags&(MEM_Int|MEM_IntReal))==0 || pMem->u.i==pX->u.i );
/* pMem is the register that is changing. But also mark pX as
** undefined so that we can quickly detect the shallow-copy error */
pX->flags = MEM_Undefined;
pX->pScopyFrom = 0;
} }
/* If pX is marked as a shallow copy of pMem, then try to verify that
** no significant changes have been made to pX since the OP_SCopy.
** A significant change would indicated a missed call to this
** function for pX. Minor changes, such as adding or removing a
** dual type, are allowed, as long as the underlying value is the
** same. */
mFlags = pMem->flags & pX->flags & pX->mScopyFlags;
assert( (mFlags&(MEM_Int|MEM_IntReal))==0 || pMem->u.i==pX->u.i );
/* pMem is the register that is changing. But also mark pX as
** undefined so that we can quickly detect the shallow-copy error */
pX->flags = MEM_Undefined;
pX->pScopyFrom = 0;
} }
pMem->bScopy = 0;
} }
pMem->pScopyFrom = 0; pMem->pScopyFrom = 0;
} }