Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Performance improvements on memory copies inside of btree by moving 2 bytes at a time instead of just 1 byte at a time. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
897f56a158ebe62758c9998e4941ae04 |
User & Date: | drh 2011-06-03 23:28:33.011 |
References
2011-06-06
| ||
13:38 | Add assert() statements to verify that u16 pointers associated with the enhancement in [897f56a158] are always 2-byte aligned. (check-in: 98ccfa930e user: drh tags: trunk) | |
Context
2011-06-04
| ||
01:43 | Performance improvement to the btree search routine. (check-in: 65db822f20 user: drh tags: trunk) | |
2011-06-03
| ||
23:28 | Performance improvements on memory copies inside of btree by moving 2 bytes at a time instead of just 1 byte at a time. (check-in: 897f56a158 user: drh tags: trunk) | |
21:34 | Performance enhancement to the blob-literal tokenizer. (check-in: 61aa2031f1 user: drh tags: trunk) | |
Changes
Changes to src/btree.c.
︙ | ︙ | |||
5418 5419 5420 5421 5422 5423 5424 | rc = freeSpace(pPage, pc, sz); if( rc ){ *pRC = rc; return; } endPtr = &data[pPage->cellOffset + 2*pPage->nCell - 2]; while( ptr<endPtr ){ | | < | 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 | rc = freeSpace(pPage, pc, sz); if( rc ){ *pRC = rc; return; } endPtr = &data[pPage->cellOffset + 2*pPage->nCell - 2]; while( ptr<endPtr ){ *(u16*)ptr = *(u16*)&ptr[2]; ptr += 2; } pPage->nCell--; put2byte(&data[hdr+3], pPage->nCell); pPage->nFree += 2; } |
︙ | ︙ | |||
5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 | int idx = 0; /* Where to write new cell content in data[] */ int j; /* Loop counter */ int end; /* First byte past the last cell pointer in data[] */ int ins; /* Index in data[] where new cell pointer is inserted */ int cellOffset; /* Address of first cell pointer in data[] */ u8 *data; /* The content of the whole page */ u8 *ptr; /* Used for moving information around in data[] */ int nSkip = (iChild ? 4 : 0); if( *pRC ) return; assert( i>=0 && i<=pPage->nCell+pPage->nOverflow ); assert( pPage->nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=10921 ); | > | 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 | int idx = 0; /* Where to write new cell content in data[] */ int j; /* Loop counter */ int end; /* First byte past the last cell pointer in data[] */ int ins; /* Index in data[] where new cell pointer is inserted */ int cellOffset; /* Address of first cell pointer in data[] */ u8 *data; /* The content of the whole page */ u8 *ptr; /* Used for moving information around in data[] */ u8 *endPtr; /* End of the loop */ int nSkip = (iChild ? 4 : 0); if( *pRC ) return; assert( i>=0 && i<=pPage->nCell+pPage->nOverflow ); assert( pPage->nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=10921 ); |
︙ | ︙ | |||
5510 5511 5512 5513 5514 5515 5516 | assert( idx+sz <= (int)pPage->pBt->usableSize ); pPage->nCell++; pPage->nFree -= (u16)(2 + sz); memcpy(&data[idx+nSkip], pCell+nSkip, sz-nSkip); if( iChild ){ put4byte(&data[idx], iChild); } | | > | > | | 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 | assert( idx+sz <= (int)pPage->pBt->usableSize ); pPage->nCell++; pPage->nFree -= (u16)(2 + sz); memcpy(&data[idx+nSkip], pCell+nSkip, sz-nSkip); if( iChild ){ put4byte(&data[idx], iChild); } ptr = &data[end]; endPtr = &data[ins]; while( ptr>endPtr ){ *(u16*)ptr = *(u16*)&ptr[-2]; ptr -= 2; } put2byte(&data[ins], idx); put2byte(&data[pPage->hdrOffset+3], pPage->nCell); #ifndef SQLITE_OMIT_AUTOVACUUM if( pPage->pBt->autoVacuum ){ /* The cell may contain a pointer to an overflow page. If so, write ** the entry for the overflow page into the pointer map. |
︙ | ︙ | |||
5557 5558 5559 5560 5561 5562 5563 5564 | /* Check that the page has just been zeroed by zeroPage() */ assert( pPage->nCell==0 ); assert( get2byteNotZero(&data[hdr+5])==nUsable ); pCellptr = &data[pPage->cellOffset + nCell*2]; cellbody = nUsable; for(i=nCell-1; i>=0; i--){ pCellptr -= 2; | > | | | 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 | /* Check that the page has just been zeroed by zeroPage() */ assert( pPage->nCell==0 ); assert( get2byteNotZero(&data[hdr+5])==nUsable ); pCellptr = &data[pPage->cellOffset + nCell*2]; cellbody = nUsable; for(i=nCell-1; i>=0; i--){ u16 sz = aSize[i]; pCellptr -= 2; cellbody -= sz; put2byte(pCellptr, cellbody); memcpy(&data[cellbody], apCell[i], sz); } put2byte(&data[hdr+3], nCell); put2byte(&data[hdr+5], cellbody); pPage->nFree -= (nCell*2 + nUsable - cellbody); pPage->nCell = (u16)nCell; } |
︙ | ︙ |