perf report: Add front-entry cache for lookups
authorIngo Molnar <mingo@elte.hu>
Wed, 3 Jun 2009 17:59:24 +0000 (19:59 +0200)
committerIngo Molnar <mingo@elte.hu>
Wed, 3 Jun 2009 18:03:32 +0000 (20:03 +0200)
Before:

 Performance counter stats for './perf report -i perf.data.big':

     12453988058  instructions

 Performance counter stats for './perf report -i perf.data.big':

     12379566017  instructions

0.60% reduction.

Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Documentation/perf_counter/builtin-report.c

index e837bb983dcabe8465c4cd43bc6e5026feb38d71..33b3b15fb014a873a59d764b6243e6b68cdf10a7 100644 (file)
@@ -229,6 +229,7 @@ static int thread__set_comm(struct thread *self, const char *comm)
 }
 
 static struct rb_root threads;
+static struct thread *last_match;
 
 static struct thread *threads__findnew(pid_t pid)
 {
@@ -236,12 +237,22 @@ static struct thread *threads__findnew(pid_t pid)
        struct rb_node *parent = NULL;
        struct thread *th;
 
+       /*
+        * Font-end cache - PID lookups come in blocks,
+        * so most of the time we dont have to look up
+        * the full rbtree:
+        */
+       if (last_match && last_match->pid == pid)
+               return last_match;
+
        while (*p != NULL) {
                parent = *p;
                th = rb_entry(parent, struct thread, rb_node);
 
-               if (th->pid == pid)
+               if (th->pid == pid) {
+                       last_match = th;
                        return th;
+               }
 
                if (pid < th->pid)
                        p = &(*p)->rb_left;
@@ -253,7 +264,9 @@ static struct thread *threads__findnew(pid_t pid)
        if (th != NULL) {
                rb_link_node(&th->rb_node, parent, p);
                rb_insert_color(&th->rb_node, &threads);
+               last_match = th;
        }
+
        return th;
 }