libsysprof: sort frames with timsort

These are largely pre-sorted, but not fully when you have merged data. This
uses timsort to speed that up a bit.

In particular, the comparison of various sorts break down to (for a
~32,000,000 record capture.

  g_array_sort_with_data() => 3.9 seconds
  qsort_r() = > 3.7 seconds
  gtk_tim_sort() => .79 seconds
This commit is contained in:
Christian Hergert
2023-08-18 16:46:28 -07:00
parent c730ce8320
commit bf73d142dc
7 changed files with 1661 additions and 2 deletions

View File

@ -27,6 +27,8 @@
#include <libdex.h>
#include "timsort/gtktimsortprivate.h"
#include "sysprof-document-private.h"
#include "sysprof-bundled-symbolizer-private.h"
@ -1207,9 +1209,17 @@ sysprof_document_load_worker (GTask *task,
* have state which belongs earlier in the capture.
*/
if G_UNLIKELY (self->needs_swap)
g_array_sort_with_data (self->frames, sort_by_time_swapped, (gpointer)self->base);
gtk_tim_sort (self->frames->data,
self->frames->len,
sizeof (SysprofDocumentFramePointer),
sort_by_time_swapped,
(gpointer)self->base);
else
g_array_sort_with_data (self->frames, sort_by_time, (gpointer)self->base);
gtk_tim_sort (self->frames->data,
self->frames->len,
sizeof (SysprofDocumentFramePointer),
sort_by_time,
(gpointer)self->base);
for (guint f = 0; f < self->frames->len; f++)
{