[gtksourceview/wip/search: 25/36] test-search-performances
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview/wip/search: 25/36] test-search-performances
- Date: Sat, 6 Jul 2013 15:58:49 +0000 (UTC)
commit 4ffd8d5d9bd5349d673ee5af4d7de001943a9fba
Author: Sébastien Wilmet <swilmet gnome org>
Date: Tue Jul 2 21:48:10 2013 +0200
test-search-performances
Not unit tests, just a program that we can launch to see some
performances results.
Results on my computer:
basic forward search, no flags: 1.104767 seconds.
basic forward search, visible and text only flags: 1.400357 seconds.
basic forward search, all flags: 8.315412 seconds.
smart synchronous forward search, case insensitive: 8.052743 seconds.
smart synchronous forward search, case sensitive: 0.899244 seconds.
smart asynchronous search, case sensitive: 1.247741 seconds.
tests/Makefile.am | 8 ++
tests/test-search-performances.c | 183 ++++++++++++++++++++++++++++++++++++++
2 files changed, 191 insertions(+), 0 deletions(-)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 7a55e7d..332989b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -48,6 +48,14 @@ test_search_ui_LDADD = \
$(DEP_LIBS) \
$(TESTS_LIBS)
+TEST_PROGS += test-search-performances
+test_search_performances_SOURCES = \
+ test-search-performances.c
+test_search_performances_LDADD = \
+ $(top_builddir)/gtksourceview/libgtksourceview-3.0.la \
+ $(DEP_LIBS) \
+ $(TESTS_LIBS)
+
UNIT_TEST_PROGS = test-languagemanager
test_languagemanager_SOURCES = \
test-languagemanager.c
diff --git a/tests/test-search-performances.c b/tests/test-search-performances.c
new file mode 100644
index 0000000..42b8a69
--- /dev/null
+++ b/tests/test-search-performances.c
@@ -0,0 +1,183 @@
+/*
+ * test-search-performances.c
+ * This file is part of GtkSourceView
+ *
+ * Copyright (C) 2013 - Sébastien Wilmet <swilmet gnome org>
+ *
+ * GtkSourceView is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * GtkSourceView is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <gtk/gtk.h>
+#include <gtksourceview/gtksource.h>
+
+/* This measures the execution times for basic search (with
+ * gtk_text_iter_forward_search()), and "smart" search (the first search with
+ * gtk_text_iter_forward_search(), later searches with
+ * gtk_text_iter_forward_to_tag_toggle()).
+ * For the "smart" search, only the first search is measured. Later searches
+ * are really fast (going to the previous/next occurrence is done in O(1)).
+ * Different search flags are also tested. We can see a big difference between
+ * the case sensitive search and case insensitive.
+ */
+
+static void
+on_notify_search_occurrences_count_cb (GtkSourceBuffer *buffer,
+ GParamSpec *spec,
+ GTimer *timer)
+{
+ g_print ("smart asynchronous search, case sensitive: %lf seconds.\n",
+ g_timer_elapsed (timer, NULL));
+
+ gtk_main_quit ();
+}
+
+int
+main (int argc, char *argv[])
+{
+ GtkSourceBuffer *buffer;
+ GtkTextIter iter;
+ GtkTextIter match_end;
+ GTimer *timer;
+ gint i;
+ GtkTextSearchFlags flags;
+
+ gtk_init (&argc, &argv);
+
+ buffer = gtk_source_buffer_new (NULL);
+
+ gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
+
+ for (i = 0; i < 1000000; i++)
+ {
+ gtk_text_buffer_insert (GTK_TEXT_BUFFER (buffer),
+ &iter,
+ "A line of text to fill the text buffer. Is it long enough?\n",
+ -1);
+ }
+
+ gtk_text_buffer_insert (GTK_TEXT_BUFFER (buffer), &iter, "foo\n", -1);
+
+ /* Basic search, no flags */
+
+ timer = g_timer_new ();
+
+ gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
+
+ flags = 0;
+
+ while (gtk_text_iter_forward_search (&iter, "foo", flags, NULL, &match_end, NULL))
+ {
+ iter = match_end;
+ }
+
+ g_timer_stop (timer);
+ g_print ("basic forward search, no flags: %lf seconds.\n",
+ g_timer_elapsed (timer, NULL));
+
+ /* Basic search, with flags always enabled by gsv */
+
+ g_timer_start (timer);
+
+ gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
+
+ flags = GTK_TEXT_SEARCH_VISIBLE_ONLY | GTK_TEXT_SEARCH_TEXT_ONLY;
+
+ while (gtk_text_iter_forward_search (&iter, "foo", flags, NULL, &match_end, NULL))
+ {
+ iter = match_end;
+ }
+
+ g_timer_stop (timer);
+ g_print ("basic forward search, visible and text only flags: %lf seconds.\n",
+ g_timer_elapsed (timer, NULL));
+
+ /* Basic search, with default flags in gsv */
+
+ g_timer_start (timer);
+
+ gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
+
+ flags = GTK_TEXT_SEARCH_VISIBLE_ONLY |
+ GTK_TEXT_SEARCH_TEXT_ONLY |
+ GTK_TEXT_SEARCH_CASE_INSENSITIVE;
+
+ while (gtk_text_iter_forward_search (&iter, "foo", flags, NULL, &match_end, NULL))
+ {
+ iter = match_end;
+ }
+
+ g_timer_stop (timer);
+ g_print ("basic forward search, all flags: %lf seconds.\n",
+ g_timer_elapsed (timer, NULL));
+
+ /* Smart forward search, with default flags in gsv */
+
+ g_timer_start (timer);
+
+ gtk_source_buffer_set_search_wrap_around (buffer, FALSE);
+ gtk_source_buffer_set_search_text (buffer, "foo");
+
+ gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
+
+ while (gtk_source_buffer_forward_search (buffer, &iter, NULL, &match_end))
+ {
+ iter = match_end;
+ }
+
+ g_timer_stop (timer);
+ g_print ("smart synchronous forward search, case insensitive: %lf seconds.\n",
+ g_timer_elapsed (timer, NULL));
+
+ /* Smart forward search, case sensitive */
+
+ g_timer_start (timer);
+
+ gtk_source_buffer_set_search_text (buffer, NULL);
+ gtk_source_buffer_set_case_sensitive_search (buffer, TRUE);
+ gtk_source_buffer_set_search_text (buffer, "foo");
+
+ gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
+
+ while (gtk_source_buffer_forward_search (buffer, &iter, NULL, &match_end))
+ {
+ iter = match_end;
+ }
+
+ g_timer_stop (timer);
+ g_print ("smart synchronous forward search, case sensitive: %lf seconds.\n",
+ g_timer_elapsed (timer, NULL));
+
+ /* Smart search, case sensitive, asynchronous */
+
+ /* The asynchronous overhead doesn't depend on the search flags, it
+ * depends on the maximum number of lines to scan in one batch, and
+ * (obviously), on the buffer size.
+ * You can tune SCAN_BATCH_SIZE in gtksourcesearch.c to see a difference
+ * in the overhead.
+ */
+
+ g_signal_connect (buffer,
+ "notify::search-occurrences-count",
+ G_CALLBACK (on_notify_search_occurrences_count_cb),
+ timer);
+
+ g_timer_start (timer);
+
+ gtk_source_buffer_set_search_text (buffer, NULL);
+ gtk_source_buffer_set_search_text (buffer, "foo");
+
+ gtk_main ();
+ return 0;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]