Commit 05472daa authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

perf diff: Change compute methods to work with pair directly

Changing compute methods to operate over hist entry and its pair
directly. This makes the code more obvious and readable, instead of all
time checking for pair being != NULL.
Signed-off-by: default avatarJiri Olsa <jolsa@redhat.com>
Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1354110769-2998-6-git-send-email-jolsa@redhat.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent fa283ada
...@@ -146,47 +146,40 @@ static int setup_compute(const struct option *opt, const char *str, ...@@ -146,47 +146,40 @@ static int setup_compute(const struct option *opt, const char *str,
return -EINVAL; return -EINVAL;
} }
static double get_period_percent(struct hist_entry *he, u64 period) double perf_diff__period_percent(struct hist_entry *he, u64 period)
{ {
u64 total = he->hists->stats.total_period; u64 total = he->hists->stats.total_period;
return (period * 100.0) / total; return (period * 100.0) / total;
} }
double perf_diff__compute_delta(struct hist_entry *he) double perf_diff__compute_delta(struct hist_entry *he, struct hist_entry *pair)
{ {
struct hist_entry *pair = hist_entry__next_pair(he); double new_percent = perf_diff__period_percent(he, he->stat.period);
double new_percent = get_period_percent(he, he->stat.period); double old_percent = perf_diff__period_percent(pair, pair->stat.period);
double old_percent = pair ? get_period_percent(pair, pair->stat.period) : 0.0;
he->diff.period_ratio_delta = new_percent - old_percent; he->diff.period_ratio_delta = new_percent - old_percent;
he->diff.computed = true; he->diff.computed = true;
return he->diff.period_ratio_delta; return he->diff.period_ratio_delta;
} }
double perf_diff__compute_ratio(struct hist_entry *he) double perf_diff__compute_ratio(struct hist_entry *he, struct hist_entry *pair)
{ {
struct hist_entry *pair = hist_entry__next_pair(he);
double new_period = he->stat.period; double new_period = he->stat.period;
double old_period = pair ? pair->stat.period : 0; double old_period = pair->stat.period;
he->diff.computed = true; he->diff.computed = true;
he->diff.period_ratio = pair ? (new_period / old_period) : 0; he->diff.period_ratio = new_period / old_period;
return he->diff.period_ratio; return he->diff.period_ratio;
} }
s64 perf_diff__compute_wdiff(struct hist_entry *he) s64 perf_diff__compute_wdiff(struct hist_entry *he, struct hist_entry *pair)
{ {
struct hist_entry *pair = hist_entry__next_pair(he);
u64 new_period = he->stat.period; u64 new_period = he->stat.period;
u64 old_period = pair ? pair->stat.period : 0; u64 old_period = pair->stat.period;
he->diff.computed = true; he->diff.computed = true;
he->diff.wdiff = new_period * compute_wdiff_w2 -
if (!pair) old_period * compute_wdiff_w1;
he->diff.wdiff = 0;
else
he->diff.wdiff = new_period * compute_wdiff_w2 -
old_period * compute_wdiff_w1;
return he->diff.wdiff; return he->diff.wdiff;
} }
...@@ -385,18 +378,21 @@ static void hists__precompute(struct hists *hists) ...@@ -385,18 +378,21 @@ static void hists__precompute(struct hists *hists)
while (next != NULL) { while (next != NULL) {
struct hist_entry *he = rb_entry(next, struct hist_entry, rb_node); struct hist_entry *he = rb_entry(next, struct hist_entry, rb_node);
struct hist_entry *pair = hist_entry__next_pair(he);
next = rb_next(&he->rb_node); next = rb_next(&he->rb_node);
if (!pair)
continue;
switch (compute) { switch (compute) {
case COMPUTE_DELTA: case COMPUTE_DELTA:
perf_diff__compute_delta(he); perf_diff__compute_delta(he, pair);
break; break;
case COMPUTE_RATIO: case COMPUTE_RATIO:
perf_diff__compute_ratio(he); perf_diff__compute_ratio(he, pair);
break; break;
case COMPUTE_WEIGHTED_DIFF: case COMPUTE_WEIGHTED_DIFF:
perf_diff__compute_wdiff(he); perf_diff__compute_wdiff(he, pair);
break; break;
default: default:
BUG_ON(1); BUG_ON(1);
......
...@@ -268,14 +268,18 @@ static int hpp__width_delta(struct perf_hpp *hpp __maybe_unused) ...@@ -268,14 +268,18 @@ static int hpp__width_delta(struct perf_hpp *hpp __maybe_unused)
static int hpp__entry_delta(struct perf_hpp *hpp, struct hist_entry *he) static int hpp__entry_delta(struct perf_hpp *hpp, struct hist_entry *he)
{ {
struct hist_entry *pair = hist_entry__next_pair(he);
const char *fmt = symbol_conf.field_sep ? "%s" : "%7.7s"; const char *fmt = symbol_conf.field_sep ? "%s" : "%7.7s";
char buf[32] = " "; char buf[32] = " ";
double diff; double diff = 0.0;
if (he->diff.computed) if (pair) {
diff = he->diff.period_ratio_delta; if (he->diff.computed)
else diff = he->diff.period_ratio_delta;
diff = perf_diff__compute_delta(he); else
diff = perf_diff__compute_delta(he, pair);
} else
diff = perf_diff__period_percent(he, he->stat.period);
if (fabs(diff) >= 0.01) if (fabs(diff) >= 0.01)
scnprintf(buf, sizeof(buf), "%+4.2F%%", diff); scnprintf(buf, sizeof(buf), "%+4.2F%%", diff);
...@@ -297,14 +301,17 @@ static int hpp__width_ratio(struct perf_hpp *hpp __maybe_unused) ...@@ -297,14 +301,17 @@ static int hpp__width_ratio(struct perf_hpp *hpp __maybe_unused)
static int hpp__entry_ratio(struct perf_hpp *hpp, struct hist_entry *he) static int hpp__entry_ratio(struct perf_hpp *hpp, struct hist_entry *he)
{ {
struct hist_entry *pair = hist_entry__next_pair(he);
const char *fmt = symbol_conf.field_sep ? "%s" : "%14s"; const char *fmt = symbol_conf.field_sep ? "%s" : "%14s";
char buf[32] = " "; char buf[32] = " ";
double ratio; double ratio = 0.0;
if (he->diff.computed) if (pair) {
ratio = he->diff.period_ratio; if (he->diff.computed)
else ratio = he->diff.period_ratio;
ratio = perf_diff__compute_ratio(he); else
ratio = perf_diff__compute_ratio(he, pair);
}
if (ratio > 0.0) if (ratio > 0.0)
scnprintf(buf, sizeof(buf), "%+14.6F", ratio); scnprintf(buf, sizeof(buf), "%+14.6F", ratio);
...@@ -326,14 +333,17 @@ static int hpp__width_wdiff(struct perf_hpp *hpp __maybe_unused) ...@@ -326,14 +333,17 @@ static int hpp__width_wdiff(struct perf_hpp *hpp __maybe_unused)
static int hpp__entry_wdiff(struct perf_hpp *hpp, struct hist_entry *he) static int hpp__entry_wdiff(struct perf_hpp *hpp, struct hist_entry *he)
{ {
struct hist_entry *pair = hist_entry__next_pair(he);
const char *fmt = symbol_conf.field_sep ? "%s" : "%14s"; const char *fmt = symbol_conf.field_sep ? "%s" : "%14s";
char buf[32] = " "; char buf[32] = " ";
s64 wdiff; s64 wdiff = 0;
if (he->diff.computed) if (pair) {
wdiff = he->diff.wdiff; if (he->diff.computed)
else wdiff = he->diff.wdiff;
wdiff = perf_diff__compute_wdiff(he); else
wdiff = perf_diff__compute_wdiff(he, pair);
}
if (wdiff != 0) if (wdiff != 0)
scnprintf(buf, sizeof(buf), "%14ld", wdiff); scnprintf(buf, sizeof(buf), "%14ld", wdiff);
......
...@@ -226,8 +226,9 @@ int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist __maybe_unused, ...@@ -226,8 +226,9 @@ int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist __maybe_unused,
unsigned int hists__sort_list_width(struct hists *self); unsigned int hists__sort_list_width(struct hists *self);
double perf_diff__compute_delta(struct hist_entry *he); double perf_diff__compute_delta(struct hist_entry *he, struct hist_entry *pair);
double perf_diff__compute_ratio(struct hist_entry *he); double perf_diff__compute_ratio(struct hist_entry *he, struct hist_entry *pair);
s64 perf_diff__compute_wdiff(struct hist_entry *he); s64 perf_diff__compute_wdiff(struct hist_entry *he, struct hist_entry *pair);
int perf_diff__formula(char *buf, size_t size, struct hist_entry *he); int perf_diff__formula(char *buf, size_t size, struct hist_entry *he);
double perf_diff__period_percent(struct hist_entry *he, u64 period);
#endif /* __PERF_HIST_H */ #endif /* __PERF_HIST_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment