mirror of
https://github.com/sqlite/sqlite.git
synced 2026-10-23 21:49:02 +03:00
Performance optimization in OP_Column: decode serial types 0 through 6, 8, and 9 (NULL and all integer widths) inline in a switch, avoiding the call and dispatch overhead of sqlite3VdbeSerialGet(). The wide-integer cases 5 and 6 add bulk, but omitting them would leave those types paying the switch miss plus the original call. Other serial types are decoded as before.
FossilOrigin-Name: cf829cc21ba3e00e9201f02a8feb2fe60f937315f1b267457717e8cd824f8e1d
This commit is contained in:
17
manifest
17
manifest
@@ -1,5 +1,5 @@
|
||||
C The\ssorter\senhancement\sat\s[bdc841de10fef65b]\scontains\sa\sbug\swhere\sit\nmight\ssort\s64-bit\sintegers\sin\sthe\swrong\sorder\sdue\sto\sthe\slimited\nprecision\sof\sdouble.\s\sFixed\shere.
|
||||
D 2026-08-04T20:40:10.440
|
||||
C Performance\soptimization\sin\sOP_Column:\sdecode\sserial\stypes\s0\sthrough\s6,\s8,\sand\s9\s(NULL\sand\sall\sinteger\swidths)\sinline\sin\sa\sswitch,\savoiding\sthe\scall\sand\sdispatch\soverhead\sof\ssqlite3VdbeSerialGet().\sThe\swide-integer\scases\s5\sand\s6\sadd\sbulk,\sbut\somitting\sthem\swould\sleave\sthose\stypes\spaying\sthe\sswitch\smiss\splus\sthe\soriginal\scall.\sOther\sserial\stypes\sare\sdecoded\sas\sbefore.
|
||||
D 2026-08-07T00:00:05.627
|
||||
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
@@ -809,7 +809,7 @@ F src/upsert.c dd9f0fcccbfb4f20e1026a21a7254ba3f2c08e9cfa92affaff5b5ec3b00ea549
|
||||
F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165
|
||||
F src/util.c fcab5d997364c657e973e2bd3b9d2181aeb0926be0c028f20dfd4445894af3b4
|
||||
F src/vacuum.c d3d35d8ae893d419ade5fa196d761a83bddcbb62137a1a157ae751ef38b26e82
|
||||
F src/vdbe.c 0649187bbbe1990e7d32f4737d59cacf554de34b30a3121279830f3e0d3859ff
|
||||
F src/vdbe.c 27338bd31556b944154a4fa59967d97e7fb43852249dd34197544945ac092899
|
||||
F src/vdbe.h 70e862ac8a11b590f8c1eaac17a0078429d42bc4ea3f757a9af0f451dd966a71
|
||||
F src/vdbeInt.h c31ba4dc8d280c2b1dc89c6fcee68f2555e3813ab34279552c20b964c0e338b1
|
||||
F src/vdbeapi.c 6ad0c841b6cb87de068f71787f385149d794e8830176bf72d09a36b9f655ac5b
|
||||
@@ -2218,8 +2218,11 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
|
||||
F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
|
||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
|
||||
P bdc841de10fef65b627deb8b770702c976174a66af847c96ebecf24d91798744
|
||||
R 0db8bad880544fadd75c136d6d89db37
|
||||
U drh
|
||||
Z c0254d132a18aeae6d54aba80ce46af2
|
||||
P 6bdfff7ddb63d0b4f28f6c174a36e81486a652056a4e21644378a22feda780fd
|
||||
R 85ac5a0e76583d1cebd71a1fc73dc3a8
|
||||
T *branch * opcol-inline-ints
|
||||
T *sym-opcol-inline-ints *
|
||||
T -sym-trunk *
|
||||
U jeffchen
|
||||
Z 95c84f6166e2c42d3da56108de95ab36
|
||||
# Remove this line to create a well-formed Fossil manifest.
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
branch trunk
|
||||
tag trunk
|
||||
branch opcol-inline-ints
|
||||
tag opcol-inline-ints
|
||||
|
||||
@@ -1 +1 @@
|
||||
6bdfff7ddb63d0b4f28f6c174a36e81486a652056a4e21644378a22feda780fd
|
||||
cf829cc21ba3e00e9201f02a8feb2fe60f937315f1b267457717e8cd824f8e1d
|
||||
|
||||
48
src/vdbe.c
48
src/vdbe.c
@@ -3250,7 +3250,53 @@ op_column_restart:
|
||||
** page - where the content is not on an overflow page */
|
||||
zData = pC->aRow + aOffset[p2];
|
||||
if( t<12 ){
|
||||
sqlite3VdbeSerialGet(zData, t, pDest);
|
||||
switch( t ){
|
||||
case 0:
|
||||
pDest->flags = MEM_Null;
|
||||
break;
|
||||
case 1:
|
||||
pDest->u.i = (i8)zData[0];
|
||||
pDest->flags = MEM_Int;
|
||||
testcase( pDest->u.i<0 );
|
||||
break;
|
||||
case 2:
|
||||
pDest->u.i = 256*(i8)zData[0] | zData[1];
|
||||
pDest->flags = MEM_Int;
|
||||
testcase( pDest->u.i<0 );
|
||||
break;
|
||||
case 3:
|
||||
pDest->u.i = 65536*(i8)zData[0] | (zData[1]<<8) | zData[2];
|
||||
pDest->flags = MEM_Int;
|
||||
testcase( pDest->u.i<0 );
|
||||
break;
|
||||
case 4:
|
||||
pDest->u.i = 16777216*(i8)zData[0] | (zData[1]<<16)
|
||||
| (zData[2]<<8) | zData[3];
|
||||
pDest->flags = MEM_Int;
|
||||
testcase( pDest->u.i<0 );
|
||||
break;
|
||||
case 5:
|
||||
pDest->u.i = (((u32)zData[2]<<24)|(zData[3]<<16)|(zData[4]<<8)|zData[5])
|
||||
+ (((i64)1)<<32)*(256*(i8)zData[0] | zData[1]);
|
||||
pDest->flags = MEM_Int;
|
||||
testcase( pDest->u.i<0 );
|
||||
break;
|
||||
case 6: {
|
||||
u64 x = ((u64)(((u32)zData[0]<<24)|(zData[1]<<16)|(zData[2]<<8)|zData[3])<<32)
|
||||
+ (((u32)zData[4]<<24)|(zData[5]<<16)|(zData[6]<<8)|zData[7]);
|
||||
memcpy(&pDest->u.i, &x, sizeof(x));
|
||||
pDest->flags = MEM_Int;
|
||||
testcase( pDest->u.i<0 );
|
||||
break;
|
||||
}
|
||||
case 8:
|
||||
case 9:
|
||||
pDest->u.i = t-8;
|
||||
pDest->flags = MEM_Int;
|
||||
break;
|
||||
default:
|
||||
sqlite3VdbeSerialGet(zData, t, pDest);
|
||||
}
|
||||
}else{
|
||||
/* If the column value is a string, we need a persistent value, not
|
||||
** a MEM_Ephem value. This branch is a fast short-cut that is equivalent
|
||||
|
||||
Reference in New Issue
Block a user