|
@@ -146,47 +146,40 @@ static int setup_compute(const struct option *opt, const char *str,
|
|
|
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;
|
|
|
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 = get_period_percent(he, he->stat.period);
|
|
|
- double old_percent = pair ? get_period_percent(pair, pair->stat.period) : 0.0;
|
|
|
+ double new_percent = perf_diff__period_percent(he, he->stat.period);
|
|
|
+ double old_percent = perf_diff__period_percent(pair, pair->stat.period);
|
|
|
|
|
|
he->diff.period_ratio_delta = new_percent - old_percent;
|
|
|
he->diff.computed = true;
|
|
|
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 old_period = pair ? pair->stat.period : 0;
|
|
|
+ double old_period = pair->stat.period;
|
|
|
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
-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 old_period = pair ? pair->stat.period : 0;
|
|
|
+ u64 old_period = pair->stat.period;
|
|
|
|
|
|
he->diff.computed = true;
|
|
|
-
|
|
|
- if (!pair)
|
|
|
- he->diff.wdiff = 0;
|
|
|
- else
|
|
|
- he->diff.wdiff = new_period * compute_wdiff_w2 -
|
|
|
- old_period * compute_wdiff_w1;
|
|
|
+ he->diff.wdiff = new_period * compute_wdiff_w2 -
|
|
|
+ old_period * compute_wdiff_w1;
|
|
|
|
|
|
return he->diff.wdiff;
|
|
|
}
|
|
@@ -385,18 +378,21 @@ static void hists__precompute(struct hists *hists)
|
|
|
|
|
|
while (next != NULL) {
|
|
|
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);
|
|
|
+ if (!pair)
|
|
|
+ continue;
|
|
|
|
|
|
switch (compute) {
|
|
|
case COMPUTE_DELTA:
|
|
|
- perf_diff__compute_delta(he);
|
|
|
+ perf_diff__compute_delta(he, pair);
|
|
|
break;
|
|
|
case COMPUTE_RATIO:
|
|
|
- perf_diff__compute_ratio(he);
|
|
|
+ perf_diff__compute_ratio(he, pair);
|
|
|
break;
|
|
|
case COMPUTE_WEIGHTED_DIFF:
|
|
|
- perf_diff__compute_wdiff(he);
|
|
|
+ perf_diff__compute_wdiff(he, pair);
|
|
|
break;
|
|
|
default:
|
|
|
BUG_ON(1);
|