What about sqlite3StackAllocZero and SQLITE_USE_ALLOCA? pon., 7 paź 2019 o 20:51 Dominique Pellé <dominique.pe...@gmail.com> 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 > sqlite-users@mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users