Three million rows in a GtkTreeView

Edit, the repository has since disappeared, you can find a Subversion Dump of it here:

Three million rows (the size per cell doesn’t matter a lot) in a treeview, and loading the treeview in four seconds. Is that doable? Sure! The treeview wil become very slow you think? Nope, it works as fast as any other (smaller) treeview. The amount of visible rows is what would slow it down. Since most screens can’t show more than 500 rows, and since showing more would be useless from a usability point of view, it’s fast.

I committed my performance tweaks to the demo repository. It includes using g_slice for allocating the real subject and replacing the GSList in the custom model with an implementation that uses a pointer position.

So I don’t have to depend on a slow linked list anymore. In stead I simply allocate a large block of proxy instances (three million proxy instances of 20 bytes each in a continuous allocation) and inject that as index in my custom treemodel.

Since those are proxy instances, they’ll each check whether their this->real property isn’t NULL when they are needed. When a row becomes visible, that instance is needed for the from, id and to properties. When it becomes invisible, it’s no longer needed (and should therefore be freed, but the unref_node thingy of gtktreeview doesn’t work perfectly — so when scrolling a little bit, around 200 instances are kept around for no reason, I’m going to try fixing that behaviour in gtktreeview soon).

Most of the time is spend in the loop that prepares the proxy instances (msg_header_proxy_new_alot). Bringing the (visible) items to the treeview doesn’t take a lot time, as the GtkTreeView is smart enough not to load everything in case fixed-row-height mode is on.

You don’t have to believe me, you can checkout the code here. Compile it (autotools) and try.

Anyway, I’m convinced GtkTreeView by itself isn’t slow. But that doesn’t mean that the way you use it can’t make it slow. I hope others will enjoy the demo as a starting point for getting their way of using the gtktreeview optimized. For most use-cases, the use of a GSList or GList is a better technique. A linked list makes it more easy to add new items to your model. Inserting and removing items would be a lot more difficult if you use the technique I used in the demo. That technique, however, is fast because you can allocate it as one large block and excercise your high-school pointer knowledge with.

Nevertheless, I swear the unref_node stuff isn’t working correctly! :-p. Or I misunderstood it’s purpose.

4 thoughts on “Three million rows in a GtkTreeView

  1. hoa

    for etPanX, I am using a customized tree model :
    http://dinh.dyndns.org/~dinh/blog/etpanX-2006-01-02-bis.tar.gz

    http://dinh.dyndns.org/~dinh/blog/etpan-gtk-tree-model-types.h
    http://dinh.dyndns.org/~dinh/blog/etpan-gtk-tree-model.c
    http://dinh.dyndns.org/~dinh/blog/etpan-gtk-tree-model.h

    Since GtkTreeView work with GtkTreePath, GtkTreeView is slow.
    for every node, we have to know its index. Which can lead to two solutions : either :
    - determining the path of the element, which can be slow.
    - or caching the index for each node, which will lead to a performance problem when an element will be inserted, you’ll have to update every indexes.

    You used the first solution.
    I used the second solution.

    My model is additionally a tree.
    The slowness will show when adding or removing elements.

Comments are closed.