|
Packit |
a7d494 |
/*
|
|
Packit |
a7d494 |
* test-search-performances.c
|
|
Packit |
a7d494 |
* This file is part of GtkSourceView
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* Copyright (C) 2013 - Sébastien Wilmet <swilmet@gnome.org>
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* GtkSourceView is free software; you can redistribute it and/or
|
|
Packit |
a7d494 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a7d494 |
* License as published by the Free Software Foundation; either
|
|
Packit |
a7d494 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* GtkSourceView is distributed in the hope that it will be useful,
|
|
Packit |
a7d494 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a7d494 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a7d494 |
* Lesser General Public License for more details.
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a7d494 |
* License along with this library; if not, write to the Free Software
|
|
Packit |
a7d494 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
a7d494 |
*/
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
#include <gtk/gtk.h>
|
|
Packit |
a7d494 |
#include <gtksourceview/gtksource.h>
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* This measures the execution times for:
|
|
Packit |
a7d494 |
* - basic search: with gtk_text_iter_forward_search();
|
|
Packit |
a7d494 |
* - "smart" search: the first search with gtk_text_iter_forward_search(), later
|
|
Packit |
a7d494 |
* searches with gtk_text_iter_forward_to_tag_toggle();
|
|
Packit |
a7d494 |
* - regex search.
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* For the "smart" search, only the first search is measured. Later searches
|
|
Packit |
a7d494 |
* are really fast (going to the previous/next occurrence is done in O(log n)).
|
|
Packit |
a7d494 |
* Different search flags are also tested. We can see a big difference between
|
|
Packit |
a7d494 |
* the case sensitive search and case insensitive.
|
|
Packit |
a7d494 |
*/
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
#define NB_LINES 100000
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
on_notify_search_occurrences_count_cb (GtkSourceSearchContext *search_context,
|
|
Packit |
a7d494 |
GParamSpec *spec,
|
|
Packit |
a7d494 |
GTimer *timer)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
g_print ("smart asynchronous search, case sensitive: %lf seconds.\n",
|
|
Packit |
a7d494 |
g_timer_elapsed (timer, NULL));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_main_quit ();
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
int
|
|
Packit |
a7d494 |
main (int argc, char *argv[])
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GtkSourceBuffer *buffer;
|
|
Packit |
a7d494 |
GtkSourceSearchContext *search_context;
|
|
Packit |
a7d494 |
GtkSourceSearchSettings *search_settings;
|
|
Packit |
a7d494 |
GtkTextIter iter;
|
|
Packit |
a7d494 |
GtkTextIter match_end;
|
|
Packit |
a7d494 |
GTimer *timer;
|
|
Packit |
a7d494 |
gint i;
|
|
Packit |
a7d494 |
GtkTextSearchFlags flags;
|
|
Packit |
a7d494 |
gchar *regex_pattern;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_init (&argc, &argv);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
buffer = gtk_source_buffer_new (NULL);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
for (i = 0; i < NB_LINES; i++)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
gtk_text_buffer_insert (GTK_TEXT_BUFFER (buffer),
|
|
Packit |
a7d494 |
&iter,
|
|
Packit |
a7d494 |
"A line of text to fill the text buffer. Is it long enough?\n",
|
|
Packit |
a7d494 |
-1);
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_insert (GTK_TEXT_BUFFER (buffer), &iter, "foo\n", -1);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Basic search, no flags */
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
timer = g_timer_new ();
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
flags = 0;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
while (gtk_text_iter_forward_search (&iter, "foo", flags, NULL, &match_end, NULL))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
iter = match_end;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_stop (timer);
|
|
Packit |
a7d494 |
g_print ("basic forward search, no flags: %lf seconds.\n",
|
|
Packit |
a7d494 |
g_timer_elapsed (timer, NULL));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Basic search, with flags always enabled by gsv */
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_start (timer);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
flags = GTK_TEXT_SEARCH_VISIBLE_ONLY | GTK_TEXT_SEARCH_TEXT_ONLY;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
while (gtk_text_iter_forward_search (&iter, "foo", flags, NULL, &match_end, NULL))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
iter = match_end;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_stop (timer);
|
|
Packit |
a7d494 |
g_print ("basic forward search, visible and text only flags: %lf seconds.\n",
|
|
Packit |
a7d494 |
g_timer_elapsed (timer, NULL));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Basic search, with default flags in gsv */
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_start (timer);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
flags = GTK_TEXT_SEARCH_VISIBLE_ONLY |
|
|
Packit |
a7d494 |
GTK_TEXT_SEARCH_TEXT_ONLY |
|
|
Packit |
a7d494 |
GTK_TEXT_SEARCH_CASE_INSENSITIVE;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
while (gtk_text_iter_forward_search (&iter, "foo", flags, NULL, &match_end, NULL))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
iter = match_end;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_stop (timer);
|
|
Packit |
a7d494 |
g_print ("basic forward search, all flags: %lf seconds.\n",
|
|
Packit |
a7d494 |
g_timer_elapsed (timer, NULL));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Smart forward search, with default flags in gsv */
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
search_settings = gtk_source_search_settings_new ();
|
|
Packit |
a7d494 |
search_context = gtk_source_search_context_new (buffer, search_settings);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_start (timer);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_search_text (search_settings, "foo");
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
while (gtk_source_search_context_forward2 (search_context, &iter, NULL, &match_end, NULL))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
iter = match_end;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_stop (timer);
|
|
Packit |
a7d494 |
g_print ("smart synchronous forward search, case insensitive: %lf seconds.\n",
|
|
Packit |
a7d494 |
g_timer_elapsed (timer, NULL));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Smart forward search, case sensitive */
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_start (timer);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_search_text (search_settings, NULL);
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_case_sensitive (search_settings, TRUE);
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_search_text (search_settings, "foo");
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
while (gtk_source_search_context_forward2 (search_context, &iter, NULL, &match_end, NULL))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
iter = match_end;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_stop (timer);
|
|
Packit |
a7d494 |
g_print ("smart synchronous forward search, case sensitive: %lf seconds.\n",
|
|
Packit |
a7d494 |
g_timer_elapsed (timer, NULL));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Regex search: search "foo" */
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_start (timer);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_search_text (search_settings, NULL);
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_regex_enabled (search_settings, TRUE);
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_search_text (search_settings, "foo");
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
while (gtk_source_search_context_forward2 (search_context, &iter, NULL, &match_end, NULL))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
iter = match_end;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_stop (timer);
|
|
Packit |
a7d494 |
g_print ("regex search: 'foo' (no partial matches): %lf seconds.\n",
|
|
Packit |
a7d494 |
g_timer_elapsed (timer, NULL));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Regex search: search "fill" */
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_start (timer);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_search_text (search_settings, "fill");
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
while (gtk_source_search_context_forward2 (search_context, &iter, NULL, &match_end, NULL))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
iter = match_end;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_stop (timer);
|
|
Packit |
a7d494 |
g_print ("regex search: 'fill' (no partial matches): %lf seconds.\n",
|
|
Packit |
a7d494 |
g_timer_elapsed (timer, NULL));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Regex search: search single lines */
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_start (timer);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_search_text (search_settings, ".*");
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
while (gtk_source_search_context_forward2 (search_context, &iter, NULL, &match_end, NULL))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
iter = match_end;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_stop (timer);
|
|
Packit |
a7d494 |
g_print ("regex search: match single lines (no partial matches): %lf seconds.\n",
|
|
Packit |
a7d494 |
g_timer_elapsed (timer, NULL));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Regex search: search matches of 3 lines */
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_start (timer);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* The space at the beginning of the pattern permits to not have contiguous
|
|
Packit |
a7d494 |
* matches. There is a performance issue with contiguous matches.
|
|
Packit |
a7d494 |
*/
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_search_text (search_settings, " (.*\n){3}");
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
while (gtk_source_search_context_forward2 (search_context, &iter, NULL, &match_end, NULL))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
iter = match_end;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_stop (timer);
|
|
Packit |
a7d494 |
g_print ("regex search: matches of 3 lines (small partial matches): %lf seconds.\n",
|
|
Packit |
a7d494 |
g_timer_elapsed (timer, NULL));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Regex search: search matches of really big chunks */
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_start (timer);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
regex_pattern = g_strdup_printf (" (.*\n){%d}", NB_LINES / 10);
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_search_text (search_settings, regex_pattern);
|
|
Packit |
a7d494 |
g_free (regex_pattern);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
while (gtk_source_search_context_forward2 (search_context, &iter, NULL, &match_end, NULL))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
iter = match_end;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_stop (timer);
|
|
Packit |
a7d494 |
g_print ("regex search: 10 matches of %d lines (big partial matches): %lf seconds.\n",
|
|
Packit |
a7d494 |
NB_LINES / 10,
|
|
Packit |
a7d494 |
g_timer_elapsed (timer, NULL));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Smart search, case sensitive, asynchronous */
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* The asynchronous overhead doesn't depend on the search flags, it
|
|
Packit |
a7d494 |
* depends on the maximum number of lines to scan in one batch, and
|
|
Packit |
a7d494 |
* (obviously), on the buffer size.
|
|
Packit |
a7d494 |
* You can tune SCAN_BATCH_SIZE in gtksourcesearchcontext.c to see a
|
|
Packit |
a7d494 |
* difference in the overhead.
|
|
Packit |
a7d494 |
*/
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_signal_connect (search_context,
|
|
Packit |
a7d494 |
"notify::occurrences-count",
|
|
Packit |
a7d494 |
G_CALLBACK (on_notify_search_occurrences_count_cb),
|
|
Packit |
a7d494 |
timer);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_timer_start (timer);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_search_text (search_settings, NULL);
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_regex_enabled (search_settings, FALSE);
|
|
Packit |
a7d494 |
gtk_source_search_settings_set_search_text (search_settings, "foo");
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_main ();
|
|
Packit |
a7d494 |
return 0;
|
|
Packit |
a7d494 |
}
|