aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/builtin-diff.c38
-rw-r--r--tools/perf/ui/hist.c40
-rw-r--r--tools/perf/util/hist.h7
3 files changed, 46 insertions, 39 deletions
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c
index 9fbbc01c5ad7..342085a18076 100644
--- a/tools/perf/builtin-diff.c
+++ b/tools/perf/builtin-diff.c
@@ -146,47 +146,40 @@ static int setup_compute(const struct option *opt, const char *str,
146 return -EINVAL; 146 return -EINVAL;
147} 147}
148 148
149static double get_period_percent(struct hist_entry *he, u64 period) 149double perf_diff__period_percent(struct hist_entry *he, u64 period)
150{ 150{
151 u64 total = he->hists->stats.total_period; 151 u64 total = he->hists->stats.total_period;
152 return (period * 100.0) / total; 152 return (period * 100.0) / total;
153} 153}
154 154
155double perf_diff__compute_delta(struct hist_entry *he) 155double perf_diff__compute_delta(struct hist_entry *he, struct hist_entry *pair)
156{ 156{
157 struct hist_entry *pair = hist_entry__next_pair(he); 157 double new_percent = perf_diff__period_percent(he, he->stat.period);
158 double new_percent = get_period_percent(he, he->stat.period); 158 double old_percent = perf_diff__period_percent(pair, pair->stat.period);
159 double old_percent = pair ? get_period_percent(pair, pair->stat.period) : 0.0;
160 159
161 he->diff.period_ratio_delta = new_percent - old_percent; 160 he->diff.period_ratio_delta = new_percent - old_percent;
162 he->diff.computed = true; 161 he->diff.computed = true;
163 return he->diff.period_ratio_delta; 162 return he->diff.period_ratio_delta;
164} 163}
165 164
166double perf_diff__compute_ratio(struct hist_entry *he) 165double perf_diff__compute_ratio(struct hist_entry *he, struct hist_entry *pair)
167{ 166{
168 struct hist_entry *pair = hist_entry__next_pair(he);
169 double new_period = he->stat.period; 167 double new_period = he->stat.period;
170 double old_period = pair ? pair->stat.period : 0; 168 double old_period = pair->stat.period;
171 169
172 he->diff.computed = true; 170 he->diff.computed = true;
173 he->diff.period_ratio = pair ? (new_period / old_period) : 0; 171 he->diff.period_ratio = new_period / old_period;
174 return he->diff.period_ratio; 172 return he->diff.period_ratio;
175} 173}
176 174
177s64 perf_diff__compute_wdiff(struct hist_entry *he) 175s64 perf_diff__compute_wdiff(struct hist_entry *he, struct hist_entry *pair)
178{ 176{
179 struct hist_entry *pair = hist_entry__next_pair(he);
180 u64 new_period = he->stat.period; 177 u64 new_period = he->stat.period;
181 u64 old_period = pair ? pair->stat.period : 0; 178 u64 old_period = pair->stat.period;
182 179
183 he->diff.computed = true; 180 he->diff.computed = true;
184 181 he->diff.wdiff = new_period * compute_wdiff_w2 -
185 if (!pair) 182 old_period * compute_wdiff_w1;
186 he->diff.wdiff = 0;
187 else
188 he->diff.wdiff = new_period * compute_wdiff_w2 -
189 old_period * compute_wdiff_w1;
190 183
191 return he->diff.wdiff; 184 return he->diff.wdiff;
192} 185}
@@ -385,18 +378,21 @@ static void hists__precompute(struct hists *hists)
385 378
386 while (next != NULL) { 379 while (next != NULL) {
387 struct hist_entry *he = rb_entry(next, struct hist_entry, rb_node); 380 struct hist_entry *he = rb_entry(next, struct hist_entry, rb_node);
381 struct hist_entry *pair = hist_entry__next_pair(he);
388 382
389 next = rb_next(&he->rb_node); 383 next = rb_next(&he->rb_node);
384 if (!pair)
385 continue;
390 386
391 switch (compute) { 387 switch (compute) {
392 case COMPUTE_DELTA: 388 case COMPUTE_DELTA:
393 perf_diff__compute_delta(he); 389 perf_diff__compute_delta(he, pair);
394 break; 390 break;
395 case COMPUTE_RATIO: 391 case COMPUTE_RATIO:
396 perf_diff__compute_ratio(he); 392 perf_diff__compute_ratio(he, pair);
397 break; 393 break;
398 case COMPUTE_WEIGHTED_DIFF: 394 case COMPUTE_WEIGHTED_DIFF:
399 perf_diff__compute_wdiff(he); 395 perf_diff__compute_wdiff(he, pair);
400 break; 396 break;
401 default: 397 default:
402 BUG_ON(1); 398 BUG_ON(1);
diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index 6e639b506829..108e5ed67621 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -268,14 +268,18 @@ static int hpp__width_delta(struct perf_hpp *hpp __maybe_unused)
268 268
269static int hpp__entry_delta(struct perf_hpp *hpp, struct hist_entry *he) 269static int hpp__entry_delta(struct perf_hpp *hpp, struct hist_entry *he)
270{ 270{
271 struct hist_entry *pair = hist_entry__next_pair(he);
271 const char *fmt = symbol_conf.field_sep ? "%s" : "%7.7s"; 272 const char *fmt = symbol_conf.field_sep ? "%s" : "%7.7s";
272 char buf[32] = " "; 273 char buf[32] = " ";
273 double diff; 274 double diff = 0.0;
274 275
275 if (he->diff.computed) 276 if (pair) {
276 diff = he->diff.period_ratio_delta; 277 if (he->diff.computed)
277 else 278 diff = he->diff.period_ratio_delta;
278 diff = perf_diff__compute_delta(he); 279 else
280 diff = perf_diff__compute_delta(he, pair);
281 } else
282 diff = perf_diff__period_percent(he, he->stat.period);
279 283
280 if (fabs(diff) >= 0.01) 284 if (fabs(diff) >= 0.01)
281 scnprintf(buf, sizeof(buf), "%+4.2F%%", diff); 285 scnprintf(buf, sizeof(buf), "%+4.2F%%", diff);
@@ -297,14 +301,17 @@ static int hpp__width_ratio(struct perf_hpp *hpp __maybe_unused)
297 301
298static int hpp__entry_ratio(struct perf_hpp *hpp, struct hist_entry *he) 302static int hpp__entry_ratio(struct perf_hpp *hpp, struct hist_entry *he)
299{ 303{
304 struct hist_entry *pair = hist_entry__next_pair(he);
300 const char *fmt = symbol_conf.field_sep ? "%s" : "%14s"; 305 const char *fmt = symbol_conf.field_sep ? "%s" : "%14s";
301 char buf[32] = " "; 306 char buf[32] = " ";
302 double ratio; 307 double ratio = 0.0;
303 308
304 if (he->diff.computed) 309 if (pair) {
305 ratio = he->diff.period_ratio; 310 if (he->diff.computed)
306 else 311 ratio = he->diff.period_ratio;
307 ratio = perf_diff__compute_ratio(he); 312 else
313 ratio = perf_diff__compute_ratio(he, pair);
314 }
308 315
309 if (ratio > 0.0) 316 if (ratio > 0.0)
310 scnprintf(buf, sizeof(buf), "%+14.6F", ratio); 317 scnprintf(buf, sizeof(buf), "%+14.6F", ratio);
@@ -326,14 +333,17 @@ static int hpp__width_wdiff(struct perf_hpp *hpp __maybe_unused)
326 333
327static int hpp__entry_wdiff(struct perf_hpp *hpp, struct hist_entry *he) 334static int hpp__entry_wdiff(struct perf_hpp *hpp, struct hist_entry *he)
328{ 335{
336 struct hist_entry *pair = hist_entry__next_pair(he);
329 const char *fmt = symbol_conf.field_sep ? "%s" : "%14s"; 337 const char *fmt = symbol_conf.field_sep ? "%s" : "%14s";
330 char buf[32] = " "; 338 char buf[32] = " ";
331 s64 wdiff; 339 s64 wdiff = 0;
332 340
333 if (he->diff.computed) 341 if (pair) {
334 wdiff = he->diff.wdiff; 342 if (he->diff.computed)
335 else 343 wdiff = he->diff.wdiff;
336 wdiff = perf_diff__compute_wdiff(he); 344 else
345 wdiff = perf_diff__compute_wdiff(he, pair);
346 }
337 347
338 if (wdiff != 0) 348 if (wdiff != 0)
339 scnprintf(buf, sizeof(buf), "%14ld", wdiff); 349 scnprintf(buf, sizeof(buf), "%14ld", wdiff);
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index a935a60d521c..235503aac08c 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -226,8 +226,9 @@ int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist __maybe_unused,
226 226
227unsigned int hists__sort_list_width(struct hists *self); 227unsigned int hists__sort_list_width(struct hists *self);
228 228
229double perf_diff__compute_delta(struct hist_entry *he); 229double perf_diff__compute_delta(struct hist_entry *he, struct hist_entry *pair);
230double perf_diff__compute_ratio(struct hist_entry *he); 230double perf_diff__compute_ratio(struct hist_entry *he, struct hist_entry *pair);
231s64 perf_diff__compute_wdiff(struct hist_entry *he); 231s64 perf_diff__compute_wdiff(struct hist_entry *he, struct hist_entry *pair);
232int perf_diff__formula(char *buf, size_t size, struct hist_entry *he); 232int perf_diff__formula(char *buf, size_t size, struct hist_entry *he);
233double perf_diff__period_percent(struct hist_entry *he, u64 period);
233#endif /* __PERF_HIST_H */ 234#endif /* __PERF_HIST_H */