aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan <Dan Kennedy>2022-12-07 20:09:54 +0000
committerdan <Dan Kennedy>2022-12-07 20:09:54 +0000
commit7f4b066eb2b5ab99ed126809e56e8a9bd41a91e3 (patch)
treeb905b159c9214d8360ddb8f29921ba9a0c193457 /src
parent209dbab9979628ea1587a07e11c0bcfe78971dd8 (diff)
downloadsqlite-7f4b066eb2b5ab99ed126809e56e8a9bd41a91e3.tar.gz
sqlite-7f4b066eb2b5ab99ed126809e56e8a9bd41a91e3.zip
Reduce the overhead of SQLITE_ENABLE_STMT_SCANSTATUS some.
FossilOrigin-Name: 212927e97e7be7d237de08359dce0dfb9211ac406b32009a6e15afd79c006475
Diffstat (limited to 'src')
-rw-r--r--src/vdbe.c42
-rw-r--r--src/vdbe.h4
-rw-r--r--src/vdbeInt.h6
-rw-r--r--src/vdbeapi.c22
-rw-r--r--src/vdbeaux.c30
5 files changed, 39 insertions, 65 deletions
diff --git a/src/vdbe.c b/src/vdbe.c
index cd27aff44..12b22992b 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -790,15 +790,12 @@ int sqlite3VdbeExec(
assert( pOp>=aOp && pOp<&aOp[p->nOp]);
nVmStep++;
#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
- if( p->anExec ){
- assert( p->anExec && p->anCycle );
- p->anExec[(int)(pOp-aOp)]++;
- pnCycle = &p->anCycle[pOp-aOp];
+ pOp->nExec++;
+ pnCycle = &pOp->nCycle;
# ifdef VDBE_PROFILE
- if( sqlite3NProfileCnt==0 )
+ if( sqlite3NProfileCnt==0 )
# endif
- *pnCycle -= sqlite3Hwtime();
- }
+ *pnCycle -= sqlite3Hwtime();
#endif
/* Only allow tracing if SQLITE_DEBUG is defined.
@@ -7152,10 +7149,6 @@ case OP_Program: { /* jump */
pFrame->aOp = p->aOp;
pFrame->nOp = p->nOp;
pFrame->token = pProgram->token;
-#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
- pFrame->anExec = p->anExec;
- pFrame->anCycle = p->anCycle;
-#endif
#ifdef SQLITE_DEBUG
pFrame->iFrameMagic = SQLITE_FRAME_MAGIC;
#endif
@@ -7192,10 +7185,6 @@ case OP_Program: { /* jump */
memset(pFrame->aOnce, 0, (pProgram->nOp + 7)/8);
p->aOp = aOp = pProgram->aOp;
p->nOp = pProgram->nOp;
-#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
- p->anExec = 0;
- p->anCycle = 0;
-#endif
#ifdef SQLITE_DEBUG
/* Verify that second and subsequent executions of the same trigger do not
** try to reuse register values from the first use. */
@@ -8732,17 +8721,11 @@ default: { /* This is really OP_Noop, OP_Explain */
}
#if defined(VDBE_PROFILE)
- assert( pnCycle );
- if( pnCycle ){
- *pnCycle += sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
- assert( *pnCycle < (((u64)1) << 48) );
- pnCycle = 0;
- }
+ *pnCycle += sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
+ pnCycle = 0;
#elif defined(SQLITE_ENABLE_STMT_SCANSTATUS)
- if( pnCycle ){
- *pnCycle += sqlite3Hwtime();
- pnCycle = 0;
- }
+ *pnCycle += sqlite3Hwtime();
+ pnCycle = 0;
#endif
/* The following code adds nothing to the actual functionality
@@ -8819,11 +8802,10 @@ abort_due_to_error:
** top. */
vdbe_return:
#if defined(VDBE_PROFILE)
- if( pnCycle ){
- *pnCycle += sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
- assert( *pnCycle < (((u64)1) << 48) );
- pnCycle = 0;
- }
+ if( pnCycle ){
+ *pnCycle += sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
+ pnCycle = 0;
+ }
#elif defined(SQLITE_ENABLE_STMT_SCANSTATUS)
if( pnCycle ){
*pnCycle += sqlite3Hwtime();
diff --git a/src/vdbe.h b/src/vdbe.h
index a19924743..3caf1f787 100644
--- a/src/vdbe.h
+++ b/src/vdbe.h
@@ -71,6 +71,10 @@ struct VdbeOp {
u32 iSrcLine; /* Source-code line that generated this opcode
** with flags in the upper 8 bits */
#endif
+#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
+ u64 nExec;
+ u64 nCycle;
+#endif
};
typedef struct VdbeOp VdbeOp;
diff --git a/src/vdbeInt.h b/src/vdbeInt.h
index df47e0544..cd112e9c4 100644
--- a/src/vdbeInt.h
+++ b/src/vdbeInt.h
@@ -171,8 +171,6 @@ struct VdbeFrame {
Vdbe *v; /* VM this frame belongs to */
VdbeFrame *pParent; /* Parent of this frame, or NULL if parent is main */
Op *aOp; /* Program instructions for parent frame */
- i64 *anExec; /* Event counters from parent frame */
- u64 *anCycle; /* Cycle counters from parent frame */
Mem *aMem; /* Array of memory cells for parent frame */
VdbeCursor **apCsr; /* Array of Vdbe cursors for parent frame */
u8 *aOnce; /* Bitmask used by OP_Once */
@@ -492,10 +490,6 @@ struct Vdbe {
u32 expmask; /* Binding to these vars invalidates VM */
SubProgram *pProgram; /* Linked list of all sub-programs used by VM */
AuxData *pAuxData; /* Linked list of auxdata allocations */
-#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
- i64 *anExec; /* Number of times each op has been executed */
- u64 *anCycle; /* Sum of sqlite3HwTime() spent in each opcode */
-#endif
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
int nScan; /* Entries in aScan[] */
ScanStatus *aScan; /* Scan definitions for sqlite3_stmt_scanstatus() */
diff --git a/src/vdbeapi.c b/src/vdbeapi.c
index 028eb7fe6..414745e8b 100644
--- a/src/vdbeapi.c
+++ b/src/vdbeapi.c
@@ -2123,14 +2123,12 @@ int sqlite3_stmt_scanstatus_v2(
ScanStatus *pScan;
int idx;
- /* If the v2 flag is clear, then this function must ignore any ScanStatus
- ** structures with ScanStatus.addrLoop set to 0. */
if( iScan<0 ){
int ii;
if( iScanStatusOp==SQLITE_SCANSTAT_NCYCLE ){
i64 res = 0;
for(ii=0; ii<p->nOp; ii++){
- res += p->anCycle[ii];
+ res += p->aOp[ii].nCycle;
}
*(i64*)pOut = res;
return 0;
@@ -2141,6 +2139,8 @@ int sqlite3_stmt_scanstatus_v2(
idx = iScan;
pScan = &p->aScan[idx];
}else{
+ /* If the COMPLEX flag is clear, then this function must ignore any
+ ** ScanStatus structures with ScanStatus.addrLoop set to 0. */
for(idx=0; idx<p->nScan; idx++){
pScan = &p->aScan[idx];
if( pScan->zName ){
@@ -2154,7 +2154,7 @@ int sqlite3_stmt_scanstatus_v2(
switch( iScanStatusOp ){
case SQLITE_SCANSTAT_NLOOP: {
if( pScan->addrLoop>0 ){
- *(sqlite3_int64*)pOut = p->anExec[pScan->addrLoop];
+ *(sqlite3_int64*)pOut = p->aOp[pScan->addrLoop].nExec;
}else{
*(sqlite3_int64*)pOut = -1;
}
@@ -2162,7 +2162,7 @@ int sqlite3_stmt_scanstatus_v2(
}
case SQLITE_SCANSTAT_NVISIT: {
if( pScan->addrVisit>0 ){
- *(sqlite3_int64*)pOut = p->anExec[pScan->addrVisit];
+ *(sqlite3_int64*)pOut = p->aOp[pScan->addrVisit].nExec;
}else{
*(sqlite3_int64*)pOut = -1;
}
@@ -2218,7 +2218,7 @@ int sqlite3_stmt_scanstatus_v2(
if( iIns==0 ) break;
if( iIns>0 ){
while( iIns<=iEnd ){
- res += p->anCycle[iIns];
+ res += p->aOp[iIns].nCycle;
iIns++;
}
}else{
@@ -2229,7 +2229,7 @@ int sqlite3_stmt_scanstatus_v2(
if( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_NCYCLE)==0 ){
continue;
}
- res += p->anCycle[iOp];
+ res += p->aOp[iOp].nCycle;
}
}
}
@@ -2261,7 +2261,11 @@ int sqlite3_stmt_scanstatus(
*/
void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt){
Vdbe *p = (Vdbe*)pStmt;
- memset(p->anExec, 0, p->nOp * sizeof(i64));
- memset(p->anCycle, 0, p->nOp * sizeof(u64));
+ int ii;
+ for(ii=0; ii<p->nOp; ii++){
+ Op *pOp = &p->aOp[ii];
+ pOp->nExec = 0;
+ pOp->nCycle = 0;
+ }
}
#endif /* SQLITE_ENABLE_STMT_SCANSTATUS */
diff --git a/src/vdbeaux.c b/src/vdbeaux.c
index e22b74119..8d284746f 100644
--- a/src/vdbeaux.c
+++ b/src/vdbeaux.c
@@ -262,6 +262,10 @@ int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){
#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
pOp->zComment = 0;
#endif
+#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
+ pOp->nExec = 0;
+ pOp->nCycle = 0;
+#endif
#ifdef SQLITE_DEBUG
if( p->db->flags & SQLITE_VdbeAddopTrace ){
sqlite3VdbePrintOp(0, i, &p->aOp[i]);
@@ -2508,8 +2512,10 @@ void sqlite3VdbeRewind(Vdbe *p){
p->iStatement = 0;
p->nFkConstraint = 0;
#ifdef VDBE_PROFILE
- memset(p->anExec, 0, sizeof(i64)*p->nOp);
- memset(p->anCycle, 0, sizeof(u64)*p->nOp);
+ for(i=0; i<p->nOp; i++){
+ p->aOp[i].nExec = 0;
+ p->aOp[i].nCycle = 0;
+ }
#endif
}
@@ -2617,10 +2623,6 @@ void sqlite3VdbeMakeReady(
p->aVar = allocSpace(&x, 0, nVar*sizeof(Mem));
p->apArg = allocSpace(&x, 0, nArg*sizeof(Mem*));
p->apCsr = allocSpace(&x, 0, nCursor*sizeof(VdbeCursor*));
-#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
- p->anExec = allocSpace(&x, 0, p->nOp*sizeof(i64));
- p->anCycle = allocSpace(&x, 0, p->nOp*sizeof(u64));
-#endif
if( x.nNeeded ){
x.pSpace = p->pFree = sqlite3DbMallocRawNN(db, x.nNeeded);
x.nFree = x.nNeeded;
@@ -2629,10 +2631,6 @@ void sqlite3VdbeMakeReady(
p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem));
p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*));
p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*));
-#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
- p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64));
- p->anCycle = allocSpace(&x, p->anCycle, p->nOp*sizeof(u64));
-#endif
}
}
@@ -2647,10 +2645,6 @@ void sqlite3VdbeMakeReady(
p->nMem = nMem;
initMemArray(p->aMem, nMem, db, MEM_Undefined);
memset(p->apCsr, 0, nCursor*sizeof(VdbeCursor*));
-#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
- memset(p->anExec, 0, p->nOp*sizeof(i64));
- memset(p->anCycle, 0, p->nOp*sizeof(u64));
-#endif
}
sqlite3VdbeRewind(p);
}
@@ -2708,10 +2702,6 @@ static void closeCursorsInFrame(Vdbe *p){
int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){
Vdbe *v = pFrame->v;
closeCursorsInFrame(v);
-#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
- v->anExec = pFrame->anExec;
- v->anCycle = pFrame->anCycle;
-#endif
v->aOp = pFrame->aOp;
v->nOp = pFrame->nOp;
v->aMem = pFrame->aMem;
@@ -3543,8 +3533,8 @@ int sqlite3VdbeReset(Vdbe *p){
}
for(i=0; i<p->nOp; i++){
char zHdr[100];
- i64 cnt = p->anExec[i];
- i64 cycles = p->anCycle[i];
+ i64 cnt = p->aOp[i].nExec;
+ i64 cycles = p->aOp[i].nCycle;
sqlite3_snprintf(sizeof(zHdr), zHdr, "%6u %12llu %8llu ",
cnt,
cycles,