Blame tests/testtreemodel.c

Packit 98cdb6
/* testtreemodel.c
Packit 98cdb6
 * Copyright (C) 2004  Red Hat, Inc.,  Matthias Clasen <mclasen@redhat.com>
Packit 98cdb6
 *
Packit 98cdb6
 * This library is free software; you can redistribute it and/or
Packit 98cdb6
 * modify it under the terms of the GNU Library General Public
Packit 98cdb6
 * License as published by the Free Software Foundation; either
Packit 98cdb6
 * version 2 of the License, or (at your option) any later version.
Packit 98cdb6
 *
Packit 98cdb6
 * This library is distributed in the hope that it will be useful,
Packit 98cdb6
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 98cdb6
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 98cdb6
 * Library General Public License for more details.
Packit 98cdb6
 *
Packit 98cdb6
 * You should have received a copy of the GNU Library General Public
Packit 98cdb6
 * License along with this library; if not, write to the
Packit 98cdb6
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit 98cdb6
 * Boston, MA 02111-1307, USA.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
#include "config.h"
Packit 98cdb6
Packit 98cdb6
#include <string.h>
Packit 98cdb6
Packit 98cdb6
#ifdef HAVE_MALLINFO
Packit 98cdb6
#include <malloc.h>
Packit 98cdb6
#endif
Packit 98cdb6
Packit 98cdb6
#include <gtk/gtk.h>
Packit 98cdb6
Packit 98cdb6
static gint repeats = 2;
Packit 98cdb6
static gint max_size = 8;
Packit 98cdb6
Packit 98cdb6
static GOptionEntry entries[] = {
Packit 98cdb6
  { "repeats", 'r', 0, G_OPTION_ARG_INT, &repeats, "Average over N repetitions", "N" },
Packit 98cdb6
  { "max-size", 'm', 0, G_OPTION_ARG_INT, &max_size, "Test up to 2^M items", "M" },
Packit 98cdb6
  { NULL }
Packit 98cdb6
};
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
typedef void (ClearFunc)(GtkTreeModel *model);
Packit 98cdb6
typedef void (InsertFunc)(GtkTreeModel *model,
Packit 98cdb6
			  gint          items,
Packit 98cdb6
			  gint          i);
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
list_store_append (GtkTreeModel *model,
Packit 98cdb6
		   gint          items,
Packit 98cdb6
		   gint          i)
Packit 98cdb6
{
Packit 98cdb6
  GtkListStore *store = GTK_LIST_STORE (model);
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
  gchar *text;
Packit 98cdb6
Packit 98cdb6
  text = g_strdup_printf ("row %d", i);
Packit 98cdb6
  gtk_list_store_append (store, &iter);
Packit 98cdb6
  gtk_list_store_set (store, &iter, 0, i, 1, text, -1);
Packit 98cdb6
  g_free (text);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
list_store_prepend (GtkTreeModel *model,
Packit 98cdb6
		    gint          items,
Packit 98cdb6
		    gint          i)
Packit 98cdb6
{
Packit 98cdb6
  GtkListStore *store = GTK_LIST_STORE (model);
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
  gchar *text;
Packit 98cdb6
Packit 98cdb6
  text = g_strdup_printf ("row %d", i);
Packit 98cdb6
  gtk_list_store_prepend (store, &iter);
Packit 98cdb6
  gtk_list_store_set (store, &iter, 0, i, 1, text, -1);
Packit 98cdb6
  g_free (text);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
list_store_insert (GtkTreeModel *model,
Packit 98cdb6
		   gint          items,
Packit 98cdb6
		   gint          i)
Packit 98cdb6
{
Packit 98cdb6
  GtkListStore *store = GTK_LIST_STORE (model);
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
  gchar *text;
Packit 98cdb6
  gint n;
Packit 98cdb6
Packit 98cdb6
  text = g_strdup_printf ("row %d", i);
Packit 98cdb6
  n = g_random_int_range (0, i + 1);
Packit 98cdb6
  gtk_list_store_insert (store, &iter, n);
Packit 98cdb6
  gtk_list_store_set (store, &iter, 0, i, 1, text, -1);
Packit 98cdb6
  g_free (text);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gint
Packit 98cdb6
compare (GtkTreeModel *model,
Packit 98cdb6
	 GtkTreeIter  *a,
Packit 98cdb6
	 GtkTreeIter  *b,
Packit 98cdb6
	 gpointer      data)
Packit 98cdb6
{
Packit 98cdb6
  gchar *str_a, *str_b;
Packit 98cdb6
  gint result;
Packit 98cdb6
Packit 98cdb6
  gtk_tree_model_get (model, a, 1, &str_a, -1);
Packit 98cdb6
  gtk_tree_model_get (model, b, 1, &str_b, -1);
Packit 98cdb6
  
Packit 98cdb6
  result = strcmp (str_a, str_b);
Packit 98cdb6
Packit 98cdb6
  g_free (str_a);
Packit 98cdb6
  g_free (str_b);
Packit 98cdb6
Packit 98cdb6
  return result;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
tree_store_append (GtkTreeModel *model,
Packit 98cdb6
		   gint          items,
Packit 98cdb6
		   gint          i)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeStore *store = GTK_TREE_STORE (model);
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
  gchar *text;
Packit 98cdb6
Packit 98cdb6
  text = g_strdup_printf ("row %d", i);
Packit 98cdb6
  gtk_tree_store_append (store, &iter, NULL);
Packit 98cdb6
  gtk_tree_store_set (store, &iter, 0, i, 1, text, -1);
Packit 98cdb6
  g_free (text);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
tree_store_prepend (GtkTreeModel *model,
Packit 98cdb6
		    gint          items,
Packit 98cdb6
		    gint          i)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeStore *store = GTK_TREE_STORE (model);
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
  gchar *text;
Packit 98cdb6
Packit 98cdb6
  text = g_strdup_printf ("row %d", i);
Packit 98cdb6
  gtk_tree_store_prepend (store, &iter, NULL);
Packit 98cdb6
  gtk_tree_store_set (store, &iter, 0, i, 1, text, -1);
Packit 98cdb6
  g_free (text);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
tree_store_insert_flat (GtkTreeModel *model,
Packit 98cdb6
			gint          items,
Packit 98cdb6
			gint          i)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeStore *store = GTK_TREE_STORE (model);
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
  gchar *text;
Packit 98cdb6
  gint n;
Packit 98cdb6
Packit 98cdb6
  text = g_strdup_printf ("row %d", i);
Packit 98cdb6
  n = g_random_int_range (0, i + 1);
Packit 98cdb6
  gtk_tree_store_insert (store, &iter, NULL, n);
Packit 98cdb6
  gtk_tree_store_set (store, &iter, 0, i, 1, text, -1);
Packit 98cdb6
  g_free (text);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
typedef struct {
Packit 98cdb6
  gint i;
Packit 98cdb6
  gint n;
Packit 98cdb6
  gboolean found;
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
} FindData;
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
find_nth (GtkTreeModel *model,
Packit 98cdb6
	  GtkTreePath  *path,
Packit 98cdb6
	  GtkTreeIter  *iter,
Packit 98cdb6
	  gpointer      data)
Packit 98cdb6
{
Packit 98cdb6
  FindData *fdata = (FindData *)data; 
Packit 98cdb6
Packit 98cdb6
  if (fdata->i >= fdata->n)
Packit 98cdb6
    {
Packit 98cdb6
      fdata->iter = *iter;
Packit 98cdb6
      fdata->found = TRUE;
Packit 98cdb6
      return TRUE;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  fdata->i++;
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
tree_store_insert_deep (GtkTreeModel *model,
Packit 98cdb6
			gint          items,
Packit 98cdb6
			gint          i)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeStore *store = GTK_TREE_STORE (model);
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
  gchar *text;
Packit 98cdb6
  FindData data;
Packit 98cdb6
Packit 98cdb6
  text = g_strdup_printf ("row %d", i);
Packit 98cdb6
  data.n = g_random_int_range (0, items);
Packit 98cdb6
  data.i = 0;
Packit 98cdb6
  data.found = FALSE;
Packit 98cdb6
  if (data.n < i)
Packit 98cdb6
    gtk_tree_model_foreach (model, find_nth, &data);
Packit 98cdb6
  gtk_tree_store_insert (store, &iter, data.found ? &(data.iter) : NULL, data.n);
Packit 98cdb6
  gtk_tree_store_set (store, &iter, 0, i, 1, text, -1);
Packit 98cdb6
  g_free (text);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
test_run (gchar        *title,
Packit 98cdb6
	  GtkTreeModel *store,
Packit 98cdb6
	  ClearFunc    *clear,
Packit 98cdb6
	  InsertFunc   *insert)
Packit 98cdb6
{
Packit 98cdb6
  gint i, k, d, items;
Packit 98cdb6
  GTimer *timer;
Packit 98cdb6
  gdouble elapsed;
Packit 98cdb6
  int uordblks_before = 0, memused;
Packit 98cdb6
Packit 98cdb6
  g_print ("%s (average over %d runs, time in milliseconds)\n"
Packit 98cdb6
	   "items \ttime      \ttime/item \tused memory\n", title, repeats);
Packit 98cdb6
Packit 98cdb6
  timer = g_timer_new ();
Packit 98cdb6
Packit 98cdb6
  for (k = 0; k < max_size; k++)
Packit 98cdb6
    {
Packit 98cdb6
      items = 1 << k;
Packit 98cdb6
      elapsed = 0.0;
Packit 98cdb6
      for (d = 0; d < repeats; d++)
Packit 98cdb6
	{
Packit 98cdb6
	  (*clear)(store);
Packit 98cdb6
#ifdef HAVE_MALLINFO
Packit 98cdb6
	  /* Peculiar location of this, btw.  -- MW.  */
Packit 98cdb6
	  uordblks_before = mallinfo().uordblks;
Packit 98cdb6
#endif
Packit 98cdb6
	  g_timer_reset (timer);
Packit 98cdb6
	  g_timer_start (timer);
Packit 98cdb6
	  for (i = 0; i < items; i++)
Packit 98cdb6
	    (*insert) (store, items, i);
Packit 98cdb6
	  g_timer_stop (timer);
Packit 98cdb6
	  elapsed += g_timer_elapsed (timer, NULL);
Packit 98cdb6
	}
Packit 98cdb6
      
Packit 98cdb6
      elapsed = elapsed * 1000 / repeats;
Packit 98cdb6
#ifdef HAVE_MALLINFO
Packit 98cdb6
      memused = (mallinfo().uordblks - uordblks_before) / 1024;
Packit 98cdb6
#else
Packit 98cdb6
      memused = 0;
Packit 98cdb6
#endif
Packit 98cdb6
      g_print ("%d \t%f \t%f  \t%dk\n", 
Packit 98cdb6
	       items, elapsed, elapsed/items, memused);
Packit 98cdb6
    }  
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
int
Packit 98cdb6
main (int argc, char *argv[])
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeModel *model;
Packit 98cdb6
  
Packit 98cdb6
  gtk_init_with_args (&argc, &argv, NULL, entries, NULL, NULL);
Packit 98cdb6
Packit 98cdb6
  model = GTK_TREE_MODEL (gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING));
Packit 98cdb6
  
Packit 98cdb6
  test_run ("list store append", 
Packit 98cdb6
	    model, 
Packit 98cdb6
	    (ClearFunc*)gtk_list_store_clear, 
Packit 98cdb6
	    (InsertFunc*)list_store_append);
Packit 98cdb6
Packit 98cdb6
  test_run ("list store prepend", 
Packit 98cdb6
	    model, 
Packit 98cdb6
	    (ClearFunc*)gtk_list_store_clear, 
Packit 98cdb6
	    (InsertFunc*)list_store_prepend);
Packit 98cdb6
Packit 98cdb6
  test_run ("list store insert", 
Packit 98cdb6
	    model, 
Packit 98cdb6
	    (ClearFunc*)gtk_list_store_clear, 
Packit 98cdb6
	    (InsertFunc*)list_store_insert);
Packit 98cdb6
Packit 98cdb6
  gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (model), 
Packit 98cdb6
					   compare, NULL, NULL);
Packit 98cdb6
  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), 
Packit 98cdb6
					GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
Packit 98cdb6
					GTK_SORT_ASCENDING);
Packit 98cdb6
Packit 98cdb6
  test_run ("list store insert (sorted)", 
Packit 98cdb6
	    model, 
Packit 98cdb6
	    (ClearFunc*)gtk_list_store_clear, 
Packit 98cdb6
	    (InsertFunc*)list_store_insert);
Packit 98cdb6
Packit 98cdb6
  g_object_unref (model);
Packit 98cdb6
  
Packit 98cdb6
  model = GTK_TREE_MODEL (gtk_tree_store_new (2, G_TYPE_INT, G_TYPE_STRING));
Packit 98cdb6
Packit 98cdb6
  test_run ("tree store append", 
Packit 98cdb6
	    model, 
Packit 98cdb6
	    (ClearFunc*)gtk_tree_store_clear, 
Packit 98cdb6
	    (InsertFunc*)tree_store_append);
Packit 98cdb6
Packit 98cdb6
  test_run ("tree store prepend", 
Packit 98cdb6
	    model, 
Packit 98cdb6
	    (ClearFunc*)gtk_tree_store_clear, 
Packit 98cdb6
	    (InsertFunc*)tree_store_prepend);
Packit 98cdb6
Packit 98cdb6
  test_run ("tree store insert (flat)", 
Packit 98cdb6
	    model, 
Packit 98cdb6
	    (ClearFunc*)gtk_tree_store_clear, 
Packit 98cdb6
	    (InsertFunc*)tree_store_insert_flat);
Packit 98cdb6
Packit 98cdb6
  test_run ("tree store insert (deep)", 
Packit 98cdb6
	    model, 
Packit 98cdb6
	    (ClearFunc*)gtk_tree_store_clear, 
Packit 98cdb6
	    (InsertFunc*)tree_store_insert_deep);
Packit 98cdb6
Packit 98cdb6
  gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (model), 
Packit 98cdb6
					   compare, NULL, NULL);
Packit 98cdb6
  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), 
Packit 98cdb6
					GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
Packit 98cdb6
					GTK_SORT_ASCENDING);
Packit 98cdb6
Packit 98cdb6
  test_run ("tree store insert (flat, sorted)", 
Packit 98cdb6
	    model, 
Packit 98cdb6
	    (ClearFunc*)gtk_tree_store_clear, 
Packit 98cdb6
	    (InsertFunc*)tree_store_insert_flat);
Packit 98cdb6
Packit 98cdb6
  test_run ("tree store insert (deep, sorted)", 
Packit 98cdb6
	    model, 
Packit 98cdb6
	    (ClearFunc*)gtk_tree_store_clear, 
Packit 98cdb6
	    (InsertFunc*)tree_store_insert_deep);
Packit 98cdb6
Packit 98cdb6
  return 0;
Packit 98cdb6
}