diff options
Diffstat (limited to 'tools/perf/builtin-diff.c')
| -rw-r--r-- | tools/perf/builtin-diff.c | 68 | 
1 files changed, 49 insertions, 19 deletions
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index 761f4197a9e..a0b531c14b9 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c @@ -70,8 +70,8 @@ static struct perf_tool tool = {  	.ordering_requires_timestamps = true,  }; -static void perf_session__insert_hist_entry_by_name(struct rb_root *root, -						    struct hist_entry *he) +static void insert_hist_entry_by_name(struct rb_root *root, +				      struct hist_entry *he)  {  	struct rb_node **p = &root->rb_node;  	struct rb_node *parent = NULL; @@ -90,7 +90,7 @@ static void perf_session__insert_hist_entry_by_name(struct rb_root *root,  	rb_insert_color(&he->rb_node, root);  } -static void hists__resort_entries(struct hists *self) +static void hists__name_resort(struct hists *self, bool sort)  {  	unsigned long position = 1;  	struct rb_root tmp = RB_ROOT; @@ -100,12 +100,16 @@ static void hists__resort_entries(struct hists *self)  		struct hist_entry *n = rb_entry(next, struct hist_entry, rb_node);  		next = rb_next(&n->rb_node); -		rb_erase(&n->rb_node, &self->entries);  		n->position = position++; -		perf_session__insert_hist_entry_by_name(&tmp, n); + +		if (sort) { +			rb_erase(&n->rb_node, &self->entries); +			insert_hist_entry_by_name(&tmp, n); +		}  	} -	self->entries = tmp; +	if (sort) +		self->entries = tmp;  }  static struct hist_entry *hists__find_entry(struct hists *self, @@ -121,7 +125,7 @@ static struct hist_entry *hists__find_entry(struct hists *self,  			n = n->rb_left;  		else if (cmp > 0)  			n = n->rb_right; -		else  +		else  			return iter;  	} @@ -150,6 +154,24 @@ static struct perf_evsel *evsel_match(struct perf_evsel *evsel,  	return NULL;  } +static void perf_evlist__resort_hists(struct perf_evlist *evlist, bool name) +{ +	struct perf_evsel *evsel; + +	list_for_each_entry(evsel, &evlist->entries, node) { +		struct hists *hists = &evsel->hists; + +		hists__output_resort(hists); + +		/* +		 * The hists__name_resort only sets possition +		 * if name is false. +		 */ +		if (name || ((!name) && show_displacement)) +			hists__name_resort(hists, name); +	} +} +  static int __cmd_diff(void)  {  	int ret, i; @@ -176,15 +198,8 @@ static int __cmd_diff(void)  	evlist_old = older->evlist;  	evlist_new = newer->evlist; -	list_for_each_entry(evsel, &evlist_new->entries, node) -		hists__output_resort(&evsel->hists); - -	list_for_each_entry(evsel, &evlist_old->entries, node) { -		hists__output_resort(&evsel->hists); - -		if (show_displacement) -			hists__resort_entries(&evsel->hists); -	} +	perf_evlist__resort_hists(evlist_old, true); +	perf_evlist__resort_hists(evlist_new, false);  	list_for_each_entry(evsel, &evlist_new->entries, node) {  		struct perf_evsel *evsel_old; @@ -199,8 +214,7 @@ static int __cmd_diff(void)  		first = false;  		hists__match(&evsel_old->hists, &evsel->hists); -		hists__fprintf(&evsel->hists, &evsel_old->hists, -			       show_displacement, true, 0, 0, stdout); +		hists__fprintf(&evsel->hists, true, 0, 0, stdout);  	}  out_delete: @@ -242,6 +256,21 @@ static const struct option options[] = {  	OPT_END()  }; +static void ui_init(void) +{ +	perf_hpp__init(); + +	/* No overhead column. */ +	perf_hpp__column_enable(PERF_HPP__OVERHEAD, false); + +	/* Display baseline/delta/displacement columns. */ +	perf_hpp__column_enable(PERF_HPP__BASELINE, true); +	perf_hpp__column_enable(PERF_HPP__DELTA, true); + +	if (show_displacement) +		perf_hpp__column_enable(PERF_HPP__DISPL, true); +} +  int cmd_diff(int argc, const char **argv, const char *prefix __maybe_unused)  {  	sort_order = diff__default_sort_order; @@ -264,7 +293,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix __maybe_unused)  	if (symbol__init() < 0)  		return -1; -	perf_hpp__init(true, show_displacement); +	ui_init(); +  	setup_sorting(diff_usage, options);  	setup_pager();  |