aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-02-18 10:56:43 -0500
committerSteven Rostedt <rostedt@goodmis.org>2010-02-18 10:56:43 -0500
commit66eaf1e133e8feca9e1688855aa92b752199017a (patch)
tree661c8af8b47a48c716cb1c031742b5da64ebb640
parent3c080e0fe5f28e63d5f1a6597e348901fedc0b86 (diff)
parse-events: Cache last event found
Code commonly passes around the event id and uses that to find the event. Even if the event was already found, it uses the id to find it later. By caching the last event found by the name or id, and checking that on the next query before searching, saves some time. Running trace-cmd report on 6,000,000 events went from: real 0m41.805s user 0m39.483s sys 0m2.311s to: real 0m39.769s user 0m37.401s sys 0m2.356s About a 4% speed-up. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--parse-events.c14
-rw-r--r--parse-events.h3
2 files changed, 16 insertions, 1 deletions
diff --git a/parse-events.c b/parse-events.c
index 7e0336b..db60c7b 100644
--- a/parse-events.c
+++ b/parse-events.c
@@ -2609,13 +2609,19 @@ struct event_format *pevent_find_event(struct pevent *pevent, int id)
2609 struct event_format key; 2609 struct event_format key;
2610 struct event_format *pkey = &key; 2610 struct event_format *pkey = &key;
2611 2611
2612 /* Check cache first */
2613 if (pevent->last_event && pevent->last_event->id == id)
2614 return pevent->last_event;
2615
2612 key.id = id; 2616 key.id = id;
2613 2617
2614 eventptr = bsearch(&pkey, pevent->events, pevent->nr_events, 2618 eventptr = bsearch(&pkey, pevent->events, pevent->nr_events,
2615 sizeof(*pevent->events), events_id_cmp); 2619 sizeof(*pevent->events), events_id_cmp);
2616 2620
2617 if (eventptr) 2621 if (eventptr) {
2622 pevent->last_event = *eventptr;
2618 return *eventptr; 2623 return *eventptr;
2624 }
2619 2625
2620 return NULL; 2626 return NULL;
2621} 2627}
@@ -2636,6 +2642,11 @@ pevent_find_event_by_name(struct pevent *pevent,
2636 struct event_format *event; 2642 struct event_format *event;
2637 int i; 2643 int i;
2638 2644
2645 if (pevent->last_event &&
2646 strcmp(pevent->last_event->name, name) == 0 &&
2647 (!sys || strcmp(pevent->last_event->system, sys) == 0))
2648 return pevent->last_event;
2649
2639 for (i = 0; i < pevent->nr_events; i++) { 2650 for (i = 0; i < pevent->nr_events; i++) {
2640 event = pevent->events[i]; 2651 event = pevent->events[i];
2641 if (strcmp(event->name, name) == 0) { 2652 if (strcmp(event->name, name) == 0) {
@@ -2648,6 +2659,7 @@ pevent_find_event_by_name(struct pevent *pevent,
2648 if (i == pevent->nr_events) 2659 if (i == pevent->nr_events)
2649 event = NULL; 2660 event = NULL;
2650 2661
2662 pevent->last_event = event;
2651 return event; 2663 return event;
2652} 2664}
2653 2665
diff --git a/parse-events.h b/parse-events.h
index 4aa83f7..73fc2ea 100644
--- a/parse-events.h
+++ b/parse-events.h
@@ -313,6 +313,9 @@ struct pevent {
313 struct format_field *bprint_ip_field; 313 struct format_field *bprint_ip_field;
314 struct format_field *bprint_fmt_field; 314 struct format_field *bprint_fmt_field;
315 struct format_field *bprint_buf_field; 315 struct format_field *bprint_buf_field;
316
317 /* cache */
318 struct event_format *last_event;
316}; 319};
317 320
318void die(char *fmt, ...); 321void die(char *fmt, ...);