@@ -213,11 +213,11 @@ status_t StringPool::addStyleSpan(size_t idx, const entry_style_span& span)
213213 return NO_ERROR;
214214}
215215
216- int StringPool::config_sort (const size_t * lhs , const size_t * rhs, void * state )
216+ int StringPool::config_sort (void * state , const void * lhs, const void * rhs )
217217{
218218 StringPool* pool = (StringPool*)state;
219- const entry& lhe = pool->mEntries [pool->mEntryArray [*lhs]];
220- const entry& rhe = pool->mEntries [pool->mEntryArray [*rhs]];
219+ const entry& lhe = pool->mEntries [pool->mEntryArray [*static_cast < const size_t *>( lhs) ]];
220+ const entry& rhe = pool->mEntries [pool->mEntryArray [*static_cast < const size_t *>( rhs) ]];
221221 return lhe.compare (rhe);
222222}
223223
@@ -232,13 +232,17 @@ void StringPool::sortByConfig()
232232 // At that point it maps from the new position in the array to the
233233 // original position the entry appeared.
234234 Vector<size_t > newPosToOriginalPos;
235- for (size_t i=0 ; i<mEntryArray .size (); i++) {
235+ newPosToOriginalPos.setCapacity (N);
236+ for (size_t i=0 ; i < N; i++) {
236237 newPosToOriginalPos.add (i);
237238 }
238239
239240 // Sort the array.
240241 NOISY (printf (" SORTING STRINGS BY CONFIGURATION...\n " ));
241- newPosToOriginalPos.sort (config_sort, this );
242+ // Vector::sort uses insertion sort, which is very slow for this data set.
243+ // Use quicksort instead because we don't need a stable sort here.
244+ qsort_r (newPosToOriginalPos.editArray (), N, sizeof (size_t ), this , config_sort);
245+ // newPosToOriginalPos.sort(config_sort, this);
242246 NOISY (printf (" DONE SORTING STRINGS BY CONFIGURATION.\n " ));
243247
244248 // Create the reverse mapping from the original position in the array
0 commit comments