mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
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:
@ -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++)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user