mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Avoid calling btreeParseCellPtr() from within fillInCell() since most of
what btreeParseCellPtr() computes is ignored by fillInCell(). Instead, have fillInCell() compute the values it needs inline. Performance improvement. FossilOrigin-Name: 4147f6671e3faa8ddffab8387a6c7d9b5b962fc8
This commit is contained in:
12
manifest
12
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Simplify\sthe\sCellInfo\sstructure\sfor\sa\ssize\sreduction\sand\sperformance\nimprovement.
|
C Avoid\scalling\sbtreeParseCellPtr()\sfrom\swithin\sfillInCell()\ssince\smost\sof\nwhat\sbtreeParseCellPtr()\scomputes\sis\signored\sby\sfillInCell().\s\sInstead,\shave\nfillInCell()\scompute\sthe\svalues\sit\sneeds\sinline.\s\sPerformance\simprovement.
|
||||||
D 2014-09-23T21:25:19.710
|
D 2014-09-23T22:36:25.858
|
||||||
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 2a7c67d474624732612f97a89e34cf85f8cd4905
|
F src/btree.c 11cf36074a9829bad4506e8486bfd2431168bb54
|
||||||
F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8
|
F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8
|
||||||
F src/btreeInt.h a5a869ec2c3e56ee9e214ee748d7942716be0340
|
F src/btreeInt.h a5a869ec2c3e56ee9e214ee748d7942716be0340
|
||||||
F src/build.c 8dbca25988045fbf2a33c9631c42706fa6449e60
|
F src/build.c 8dbca25988045fbf2a33c9631c42706fa6449e60
|
||||||
@@ -1200,7 +1200,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 d2962a5f388f30a02429e0c8b87399f482b5604c
|
P bf59df66b3613c38cfb13a68091b8328ebb22c78
|
||||||
R 3633e95932853227476c5d6e8f02e193
|
R 7c25e7d21782a499afecd58eb6881944
|
||||||
U drh
|
U drh
|
||||||
Z 6131f39965fefa27be7e69636d8311d7
|
Z 9128d4e264c0fc76a3ba82d24c937cbe
|
||||||
|
@@ -1 +1 @@
|
|||||||
bf59df66b3613c38cfb13a68091b8328ebb22c78
|
4147f6671e3faa8ddffab8387a6c7d9b5b962fc8
|
69
src/btree.c
69
src/btree.c
@@ -5611,7 +5611,6 @@ static int fillInCell(
|
|||||||
BtShared *pBt = pPage->pBt;
|
BtShared *pBt = pPage->pBt;
|
||||||
Pgno pgnoOvfl = 0;
|
Pgno pgnoOvfl = 0;
|
||||||
int nHeader;
|
int nHeader;
|
||||||
CellInfo info;
|
|
||||||
|
|
||||||
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
|
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
|
||||||
|
|
||||||
@@ -5621,24 +5620,18 @@ static int fillInCell(
|
|||||||
|| sqlite3PagerIswriteable(pPage->pDbPage) );
|
|| sqlite3PagerIswriteable(pPage->pDbPage) );
|
||||||
|
|
||||||
/* Fill in the header. */
|
/* Fill in the header. */
|
||||||
nHeader = 0;
|
nHeader = pPage->childPtrSize;
|
||||||
if( !pPage->leaf ){
|
nPayload = nData + nZero;
|
||||||
nHeader += 4;
|
|
||||||
}
|
|
||||||
if( pPage->hasData ){
|
if( pPage->hasData ){
|
||||||
nHeader += putVarint32(&pCell[nHeader], nData+nZero);
|
assert( pPage->intKey );
|
||||||
|
nHeader += putVarint32(&pCell[nHeader], nPayload);
|
||||||
}else{
|
}else{
|
||||||
nData = nZero = 0;
|
assert( nData==0 );
|
||||||
|
assert( nZero==0 );
|
||||||
}
|
}
|
||||||
nHeader += putVarint(&pCell[nHeader], *(u64*)&nKey);
|
nHeader += putVarint(&pCell[nHeader], *(u64*)&nKey);
|
||||||
btreeParseCellPtr(pPage, pCell, &info);
|
|
||||||
assert( nHeader=(int)(info.pPayload - pCell) );
|
|
||||||
assert( info.nKey==nKey );
|
|
||||||
assert( pPage->intKey==0 || info.nPayload==(u32)(nData+nZero) );
|
|
||||||
assert( pPage->intKey==1 || info.nPayload==nKey );
|
|
||||||
|
|
||||||
/* Fill in the payload */
|
/* Fill in the payload size */
|
||||||
nPayload = nData + nZero;
|
|
||||||
if( pPage->intKey ){
|
if( pPage->intKey ){
|
||||||
pSrc = pData;
|
pSrc = pData;
|
||||||
nSrc = nData;
|
nSrc = nData;
|
||||||
@@ -5647,15 +5640,55 @@ static int fillInCell(
|
|||||||
if( NEVER(nKey>0x7fffffff || pKey==0) ){
|
if( NEVER(nKey>0x7fffffff || pKey==0) ){
|
||||||
return SQLITE_CORRUPT_BKPT;
|
return SQLITE_CORRUPT_BKPT;
|
||||||
}
|
}
|
||||||
nPayload += (int)nKey;
|
nPayload = (int)nKey;
|
||||||
pSrc = pKey;
|
pSrc = pKey;
|
||||||
nSrc = (int)nKey;
|
nSrc = (int)nKey;
|
||||||
}
|
}
|
||||||
*pnSize = info.nSize;
|
if( nPayload<=pPage->maxLocal ){
|
||||||
spaceLeft = info.nLocal;
|
n = nHeader + nPayload;
|
||||||
|
testcase( n==3 );
|
||||||
|
testcase( n==4 );
|
||||||
|
if( n<4 ) n = 4;
|
||||||
|
*pnSize = n;
|
||||||
|
spaceLeft = nPayload;
|
||||||
|
pPrior = pCell;
|
||||||
|
}else{
|
||||||
|
int mn = pPage->minLocal;
|
||||||
|
n = mn + (nPayload - mn) % (pPage->pBt->usableSize - 4);
|
||||||
|
testcase( n==pPage->maxLocal );
|
||||||
|
testcase( n==pPage->maxLocal+1 );
|
||||||
|
if( n > pPage->maxLocal ) n = mn;
|
||||||
|
spaceLeft = n;
|
||||||
|
*pnSize = n + nHeader + 4;
|
||||||
|
pPrior = &pCell[nHeader+n];
|
||||||
|
}
|
||||||
pPayload = &pCell[nHeader];
|
pPayload = &pCell[nHeader];
|
||||||
pPrior = &pCell[info.iOverflow];
|
|
||||||
|
|
||||||
|
/* At this point variables should be set as follows:
|
||||||
|
**
|
||||||
|
** nPayload Total payload size in bytes
|
||||||
|
** pPayload Begin writing payload here
|
||||||
|
** spaceLeft Space available at pPayload. If nPayload>spaceLeft,
|
||||||
|
** that means content must spill into overflow pages.
|
||||||
|
** *pnSize Size of the local cell (not counting overflow pages)
|
||||||
|
** pPrior Where to write the pgno of the first overflow page
|
||||||
|
**
|
||||||
|
** Use a call to btreeParseCellPtr() to verify that the values above
|
||||||
|
** were computed correctly.
|
||||||
|
*/
|
||||||
|
#if SQLITE_DEBUG
|
||||||
|
{
|
||||||
|
CellInfo info;
|
||||||
|
btreeParseCellPtr(pPage, pCell, &info);
|
||||||
|
assert( nHeader=(int)(info.pPayload - pCell) );
|
||||||
|
assert( info.nKey==nKey );
|
||||||
|
assert( *pnSize == info.nSize );
|
||||||
|
assert( spaceLeft == info.nLocal );
|
||||||
|
assert( pPrior == &pCell[info.iOverflow] );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Write the payload into the local Cell and any extra into overflow pages */
|
||||||
while( nPayload>0 ){
|
while( nPayload>0 ){
|
||||||
if( spaceLeft==0 ){
|
if( spaceLeft==0 ){
|
||||||
#ifndef SQLITE_OMIT_AUTOVACUUM
|
#ifndef SQLITE_OMIT_AUTOVACUUM
|
||||||
|
Reference in New Issue
Block a user