/*
 * Program to test the performance of gtk_tree_store_prepend vs.
 * gtk_tree_store_append. Has its own timer, or use time(1) to get a
 * better idea of how much CPU time it's really taking.
 *
 * Compile it with something like:
 *   gcc `pkg-config --cflags --libs glib-2.0 gtk+-2.0` gtktreeview-perf.c
 *
 * Usage: ./a.out [p]
 *
 * The 'p' flag enables the much faster prepend method.
 *
 * By Ted Percival <ted@midg3t.net>, 2007. Use it however you like.
 * http://creativecommons.org/licenses/publicdomain/
 *
 * There is a summary of what this means at
 *   http://web.midg3t.net/blog/176/fill-your-gtktreestore-in-reverse/
 */
#include <glib.h>
#include <gtk/gtk.h>

#include <stdio.h>

int main(int argc, char *argv[]) {
    GtkTreeStore *treestore;
    GTimer *timer;
    int count;
    gboolean prepend = FALSE;

    gtk_init(&argc, &argv);

    if (argc >= 2) {
        if (*argv[1] == 'p')
            prepend = TRUE;
    }

    treestore = gtk_tree_store_new(1, G_TYPE_INT);

    timer = g_timer_new();

    for (count = 0; count < 50000; ++count) {
        GtkTreeIter iter;

        if (prepend)
            gtk_tree_store_prepend(treestore, &iter, NULL);
        else
            gtk_tree_store_append(treestore, &iter, NULL);

        gtk_tree_store_set(treestore, &iter, 0, count, -1);
    }

    g_timer_stop(timer);
    gtk_tree_store_clear(treestore);

    printf("Took %f seconds to %s %u items\n",
            g_timer_elapsed(timer, NULL),
            prepend ? "prepend" : "append", count);
        
    g_timer_destroy(timer);

    return 0;
}

/* vim: ts=4 sw=4 et tw=80
 */

