[gtk/wip/otte/sortlistmodel: 35/38] testsuite: Collect more statistics on models
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/sortlistmodel: 35/38] testsuite: Collect more statistics on models
- Date: Tue, 21 Jul 2020 14:42:42 +0000 (UTC)
commit 0cfe3410d753978ae0c2755c695a8b0b9ef88c80
Author: Benjamin Otte <otte redhat com>
Date: Wed Jul 8 14:40:01 2020 +0200
testsuite: Collect more statistics on models
* "max time"
Reports the max time taken for all main loop iterations + initial
set.
This is useful to judge the performance of incremental search models.
* "changes"
Reports the sum of all changes during items-changed signal emissions.
Uses MAX(added, removed) as the number to not double-count items that
were moved.
This is useful to judge the accuracy of the models by comparing the
number among them.
testsuite/gtk/sort-performance.c | 144 +++++++++++++++++++++++++++++----------
1 file changed, 107 insertions(+), 37 deletions(-)
---
diff --git a/testsuite/gtk/sort-performance.c b/testsuite/gtk/sort-performance.c
index a888eaef4f..87ed52c23c 100644
--- a/testsuite/gtk/sort-performance.c
+++ b/testsuite/gtk/sort-performance.c
@@ -35,42 +35,72 @@ create_sorter (void)
return gtk_custom_sorter_new (compare_string_object, NULL, NULL);
}
-G_GNUC_UNUSED static void
+static void
+count_changed_cb (GListModel *model,
+ guint position,
+ guint removed,
+ guint added,
+ guint *counter)
+{
+ *counter += MAX (removed, added);
+}
+
+static gint64
+snapshot_time (gint64 last,
+ gint64 *inout_max)
+{
+ gint64 now = g_get_monotonic_time ();
+ *inout_max = MAX (*inout_max, now - last);
+ return now;
+}
+
+static void
set_model (const char *testname,
GType type,
GListModel *source,
guint random)
{
- gint64 start, end, total;
+ gint64 start, end, max, total;
GtkSliceListModel *slice;
GtkSorter *sorter;
GListModel *sort;
- guint size = 1000;
+ guint n_changed, size = 1000;
slice = gtk_slice_list_model_new (source, 0, size);
sorter = create_sorter ();
sort = g_object_new (type,
"sorter", sorter,
NULL);
+ g_signal_connect (sort, "items-changed", G_CALLBACK (count_changed_cb), &n_changed);
g_object_unref (sorter);
while (TRUE)
{
+ while (g_main_context_pending (NULL))
+ g_main_context_iteration (NULL, TRUE);
comparisons = 0;
- start = g_get_monotonic_time ();
+ n_changed = 0;
+ max = 0;
+
+ start = end = g_get_monotonic_time ();
g_object_set (sort, "model", slice, NULL);
+ end = snapshot_time (end, &max);
while (g_main_context_pending (NULL))
- g_main_context_iteration (NULL, TRUE);
- end = g_get_monotonic_time ();
+ {
+ g_main_context_iteration (NULL, TRUE);
+ end = snapshot_time (end, &max);
+ }
total = (end - start);
- g_print ("\"%s\", \"%s\",%8u,%8uus,%8u\n",
+ g_print ("\"%s\", \"%s\",%8u,%8uus,%8uus, %8u,%9u\n",
testname,
g_type_name (type),
size,
(guint) total,
- comparisons);
+ (guint) max,
+ comparisons,
+ n_changed);
if (total > MAX_TIME)
break;
@@ -94,11 +124,11 @@ append (const char *testname,
guint random,
guint fraction)
{
- gint64 start, end, total;
+ gint64 start, end, max, total;
GtkSliceListModel *slice;
GtkSorter *sorter;
GListModel *sort;
- guint size = 1000;
+ guint n_changed, size = 1000;
slice = gtk_slice_list_model_new (source, 0, (fraction - 1) * size / fraction);
sorter = create_sorter ();
@@ -106,27 +136,37 @@ append (const char *testname,
"model", slice,
"sorter", sorter,
NULL);
+ g_signal_connect (sort, "items-changed", G_CALLBACK (count_changed_cb), &n_changed);
g_object_unref (sorter);
while (TRUE)
{
gtk_slice_list_model_set_size (slice, (fraction - 1) * size / fraction);
+ while (g_main_context_pending (NULL))
+ g_main_context_iteration (NULL, TRUE);
comparisons = 0;
+ n_changed = 0;
+ max = 0;
- start = g_get_monotonic_time ();
+ start = end = g_get_monotonic_time ();
gtk_slice_list_model_set_size (slice, size);
+ end = snapshot_time (end, &max);
while (g_main_context_pending (NULL))
- g_main_context_iteration (NULL, TRUE);
- end = g_get_monotonic_time ();
+ {
+ g_main_context_iteration (NULL, TRUE);
+ end = snapshot_time (end, &max);
+ }
total = (end - start);
- g_print ("\"%s\", \"%s\",%8u,%8uus,%8u\n",
+ g_print ("\"%s\", \"%s\",%8u,%8uus,%8uus, %8u,%9u\n",
testname,
g_type_name (type),
size,
(guint) total,
- comparisons);
+ (guint) max,
+ comparisons,
+ n_changed);
if (total > MAX_TIME)
break;
@@ -175,11 +215,11 @@ remove_test (const char *testname,
guint random,
guint fraction)
{
- gint64 start, end, total;
+ gint64 start, end, max, total;
GtkSliceListModel *slice;
GtkSorter *sorter;
GListModel *sort;
- guint size = 1000;
+ guint n_changed, size = 1000;
slice = gtk_slice_list_model_new (source, 0, size);
sorter = create_sorter ();
@@ -187,27 +227,37 @@ remove_test (const char *testname,
"model", slice,
"sorter", sorter,
NULL);
+ g_signal_connect (sort, "items-changed", G_CALLBACK (count_changed_cb), &n_changed);
g_object_unref (sorter);
while (TRUE)
{
gtk_slice_list_model_set_size (slice, size);
+ while (g_main_context_pending (NULL))
+ g_main_context_iteration (NULL, TRUE);
comparisons = 0;
+ n_changed = 0;
+ max = 0;
- start = g_get_monotonic_time ();
+ start = end = g_get_monotonic_time ();
gtk_slice_list_model_set_size (slice, (fraction - 1) * size / fraction);
+ end = snapshot_time (end, &max);
while (g_main_context_pending (NULL))
- g_main_context_iteration (NULL, TRUE);
- end = g_get_monotonic_time ();
+ {
+ g_main_context_iteration (NULL, TRUE);
+ end = snapshot_time (end, &max);
+ }
total = (end - start);
- g_print ("\"%s\", \"%s\",%8u,%8uus,%8u\n",
+ g_print ("\"%s\", \"%s\",%8u,%8uus,%8uus, %8u,%9u\n",
testname,
g_type_name (type),
size,
(guint) total,
- comparisons);
+ (guint) max,
+ comparisons,
+ n_changed);
if (total > MAX_TIME)
break;
@@ -286,11 +336,11 @@ append_n (const char *testname,
guint random,
guint n)
{
- gint64 start, end, total;
+ gint64 start, end, max, total;
GtkSliceListModel *slice;
GtkSorter *sorter;
GListModel *sort;
- guint i, size = 1000;
+ guint i, n_changed, size = 1000;
slice = gtk_slice_list_model_new (source, 0, size);
sorter = create_sorter ();
@@ -298,30 +348,40 @@ append_n (const char *testname,
"model", slice,
"sorter", sorter,
NULL);
+ g_signal_connect (sort, "items-changed", G_CALLBACK (count_changed_cb), &n_changed);
g_object_unref (sorter);
while (TRUE)
{
gtk_slice_list_model_set_size (slice, size - n * 100);
+ while (g_main_context_pending (NULL))
+ g_main_context_iteration (NULL, TRUE);
comparisons = 0;
+ n_changed = 0;
+ max = 0;
- start = g_get_monotonic_time ();
+ start = end = g_get_monotonic_time ();
for (i = 0; i < 100; i++)
{
gtk_slice_list_model_set_size (slice, size - n * (100 - i));
+ end = snapshot_time (end, &max);
while (g_main_context_pending (NULL))
- g_main_context_iteration (NULL, TRUE);
+ {
+ g_main_context_iteration (NULL, TRUE);
+ end = snapshot_time (end, &max);
+ }
}
- end = g_get_monotonic_time ();
total = (end - start);
- g_print ("\"%s\", \"%s\",%8u,%8uus,%8u\n",
+ g_print ("\"%s\", \"%s\",%8u,%8uus,%8uus, %8u,%9u\n",
testname,
g_type_name (type),
size,
(guint) total,
- comparisons);
+ (guint) max,
+ comparisons,
+ n_changed);
if (total > MAX_TIME)
break;
@@ -370,11 +430,11 @@ remove_n (const char *testname,
guint random,
guint n)
{
- gint64 start, end, total;
+ gint64 start, end, max, total;
GtkSliceListModel *slice;
GtkSorter *sorter;
GListModel *sort;
- guint i, size = 1000;
+ guint i, n_changed, size = 1000;
slice = gtk_slice_list_model_new (source, 0, size);
sorter = create_sorter ();
@@ -382,30 +442,40 @@ remove_n (const char *testname,
"model", slice,
"sorter", sorter,
NULL);
+ g_signal_connect (sort, "items-changed", G_CALLBACK (count_changed_cb), &n_changed);
g_object_unref (sorter);
while (TRUE)
{
gtk_slice_list_model_set_size (slice, size);
+ while (g_main_context_pending (NULL))
+ g_main_context_iteration (NULL, TRUE);
comparisons = 0;
+ n_changed = 0;
+ max = 0;
- start = g_get_monotonic_time ();
+ start = end = g_get_monotonic_time ();
for (i = 0; i < 100; i++)
{
gtk_slice_list_model_set_size (slice, size - n * (i + 1));
+ end = snapshot_time (end, &max);
while (g_main_context_pending (NULL))
- g_main_context_iteration (NULL, TRUE);
+ {
+ g_main_context_iteration (NULL, TRUE);
+ end = snapshot_time (end, &max);
+ }
}
- end = g_get_monotonic_time ();
total = (end - start);
- g_print ("\"%s\", \"%s\",%8u,%8uus,%8u\n",
+ g_print ("\"%s\", \"%s\",%8u,%8uus,%8uus, %8u,%9u\n",
testname,
g_type_name (type),
size,
(guint) total,
- comparisons);
+ (guint) max,
+ comparisons,
+ n_changed);
if (total > MAX_TIME)
break;
@@ -469,7 +539,7 @@ main (int argc, char *argv[])
else
tests = (const char **) argv + 1;
- g_print ("\"test\",\"model\",\"model size\",\"time\",\"comparisons\"\n");
+ g_print ("\"test\",\"model\",\"model size\",\"time\",\"max time\",\"comparisons\",\"changes\"\n");
run_test (source, tests, "set-model", set_model);
run_test (source, tests, "append-half", append_half);
run_test (source, tests, "append-10th", append_10th);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]