What about sqlite3StackAllocZero and SQLITE_USE_ALLOCA?
pon., 7 paź 2019 o 20:51 Dominique Pellé <[email protected]>
napisał(a):
> Hi
>
> Below is a patch which avoids a dynamic
> allocation in vdbeSorterSort(...), using a local
> stack array instead (faster and smaller code).
> I assume that a local array of 64 pointers is small
> enough to be in the stack.
>
> Is this worth merging?
>
> $ fossil diff src/vdbesort.c
> Index: src/vdbesort.c
> ==================================================================
> --- src/vdbesort.c
> +++ src/vdbesort.c
> @@ -1394,25 +1394,20 @@
> ** SQLITE_OK if successful, or an SQLite error code (i.e. SQLITE_NOMEM) if
> ** an error occurs.
> */
> static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){
> int i;
> - SorterRecord **aSlot;
> + SorterRecord *aSlot[64] = { 0 };
> SorterRecord *p;
> int rc;
>
> rc = vdbeSortAllocUnpacked(pTask);
> if( rc!=SQLITE_OK ) return rc;
>
> p = pList->pList;
> pTask->xCompare = vdbeSorterGetCompare(pTask->pSorter);
>
> - aSlot = (SorterRecord **)sqlite3MallocZero(64 * sizeof(SorterRecord *));
> - if( !aSlot ){
> - return SQLITE_NOMEM_BKPT;
> - }
> -
> while( p ){
> SorterRecord *pNext;
> if( pList->aMemory ){
> if( (u8*)p==pList->aMemory ){
> pNext = 0;
> @@ -1438,11 +1433,10 @@
> if( aSlot[i]==0 ) continue;
> p = p ? vdbeSorterMerge(pTask, p, aSlot[i]) : aSlot[i];
> }
> pList->pList = p;
>
> - sqlite3_free(aSlot);
> assert( pTask->pUnpacked->errCode==SQLITE_OK
> || pTask->pUnpacked->errCode==SQLITE_NOMEM
> );
> return pTask->pUnpacked->errCode;
> }
>
> Regards
> Dominique
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users