Commit 8810f6ce authored by Namhyung Kim's avatar Namhyung Kim Committed by Jiri Olsa

perf diff: Add --percentage option

The --percentage option is for controlling overhead percentage
displayed.  It can only receive either of "relative" or "absolute" and
affects -c delta output only.

For more information, please see previous commit same thing done to
"perf report".
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/1397145720-8063-5-git-send-email-namhyung@kernel.orgSigned-off-by: default avatarJiri Olsa <jolsa@redhat.com>
parent 33db4568
...@@ -33,17 +33,20 @@ OPTIONS ...@@ -33,17 +33,20 @@ OPTIONS
-d:: -d::
--dsos=:: --dsos=::
Only consider symbols in these dsos. CSV that understands Only consider symbols in these dsos. CSV that understands
file://filename entries. file://filename entries. This option will affect the percentage
of the Baseline/Delta column. See --percentage for more info.
-C:: -C::
--comms=:: --comms=::
Only consider symbols in these comms. CSV that understands Only consider symbols in these comms. CSV that understands
file://filename entries. file://filename entries. This option will affect the percentage
of the Baseline/Delta column. See --percentage for more info.
-S:: -S::
--symbols=:: --symbols=::
Only consider these symbols. CSV that understands Only consider these symbols. CSV that understands
file://filename entries. file://filename entries. This option will affect the percentage
of the Baseline/Delta column. See --percentage for more info.
-s:: -s::
--sort=:: --sort=::
...@@ -89,6 +92,14 @@ OPTIONS ...@@ -89,6 +92,14 @@ OPTIONS
--order:: --order::
Specify compute sorting column number. Specify compute sorting column number.
--percentage::
Determine how to display the overhead percentage of filtered entries.
Filters can be applied by --comms, --dsos and/or --symbols options.
"relative" means it's relative to filtered entries only so that the
sum of shown entries will be always 100%. "absolute" means it retains
the original value before and after the filter is applied.
COMPARISON COMPARISON
---------- ----------
The comparison is governed by the baseline file. The baseline perf.data The comparison is governed by the baseline file. The baseline perf.data
...@@ -157,6 +168,10 @@ with: ...@@ -157,6 +168,10 @@ with:
- period_percent being the % of the hist entry period value within - period_percent being the % of the hist entry period value within
single data file single data file
- with filtering by -C, -d and/or -S, period_percent might be changed
relative to how entries are filtered. Use --percentage=absolute to
prevent such fluctuation.
ratio ratio
~~~~~ ~~~~~
If specified the 'Ratio' column is displayed with value 'r' computed as: If specified the 'Ratio' column is displayed with value 'r' computed as:
......
...@@ -220,7 +220,8 @@ static int setup_compute(const struct option *opt, const char *str, ...@@ -220,7 +220,8 @@ static int setup_compute(const struct option *opt, const char *str,
static double period_percent(struct hist_entry *he, u64 period) static double period_percent(struct hist_entry *he, u64 period)
{ {
u64 total = he->hists->stats.total_period; u64 total = hists__total_period(he->hists);
return (period * 100.0) / total; return (period * 100.0) / total;
} }
...@@ -259,11 +260,18 @@ static s64 compute_wdiff(struct hist_entry *he, struct hist_entry *pair) ...@@ -259,11 +260,18 @@ static s64 compute_wdiff(struct hist_entry *he, struct hist_entry *pair)
static int formula_delta(struct hist_entry *he, struct hist_entry *pair, static int formula_delta(struct hist_entry *he, struct hist_entry *pair,
char *buf, size_t size) char *buf, size_t size)
{ {
u64 he_total = he->hists->stats.total_period;
u64 pair_total = pair->hists->stats.total_period;
if (symbol_conf.filter_relative) {
he_total = he->hists->stats.total_non_filtered_period;
pair_total = pair->hists->stats.total_non_filtered_period;
}
return scnprintf(buf, size, return scnprintf(buf, size,
"(%" PRIu64 " * 100 / %" PRIu64 ") - " "(%" PRIu64 " * 100 / %" PRIu64 ") - "
"(%" PRIu64 " * 100 / %" PRIu64 ")", "(%" PRIu64 " * 100 / %" PRIu64 ")",
pair->stat.period, pair->hists->stats.total_period, pair->stat.period, pair_total,
he->stat.period, he->hists->stats.total_period); he->stat.period, he_total);
} }
static int formula_ratio(struct hist_entry *he, struct hist_entry *pair, static int formula_ratio(struct hist_entry *he, struct hist_entry *pair,
...@@ -327,15 +335,16 @@ static int diff__process_sample_event(struct perf_tool *tool __maybe_unused, ...@@ -327,15 +335,16 @@ static int diff__process_sample_event(struct perf_tool *tool __maybe_unused,
return -1; return -1;
} }
if (al.filtered)
return 0;
if (hists__add_entry(&evsel->hists, &al, sample->period, if (hists__add_entry(&evsel->hists, &al, sample->period,
sample->weight, sample->transaction)) { sample->weight, sample->transaction)) {
pr_warning("problem incrementing symbol period, skipping event\n"); pr_warning("problem incrementing symbol period, skipping event\n");
return -1; return -1;
} }
if (al.filtered == 0) {
evsel->hists.stats.total_non_filtered_period += sample->period;
evsel->hists.nr_non_filtered_entries++;
}
evsel->hists.stats.total_period += sample->period; evsel->hists.stats.total_period += sample->period;
return 0; return 0;
} }
...@@ -565,7 +574,9 @@ static void hists__compute_resort(struct hists *hists) ...@@ -565,7 +574,9 @@ static void hists__compute_resort(struct hists *hists)
next = rb_first(root); next = rb_first(root);
hists->nr_entries = 0; hists->nr_entries = 0;
hists->nr_non_filtered_entries = 0;
hists->stats.total_period = 0; hists->stats.total_period = 0;
hists->stats.total_non_filtered_period = 0;
hists__reset_col_len(hists); hists__reset_col_len(hists);
while (next != NULL) { while (next != NULL) {
...@@ -732,13 +743,16 @@ static const struct option options[] = { ...@@ -732,13 +743,16 @@ static const struct option options[] = {
OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory", OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory",
"Look for files with symbols relative to this directory"), "Look for files with symbols relative to this directory"),
OPT_UINTEGER('o', "order", &sort_compute, "Specify compute sorting."), OPT_UINTEGER('o', "order", &sort_compute, "Specify compute sorting."),
OPT_CALLBACK(0, "percentage", NULL, "relative|absolute",
"How to display percentage of filtered entries", parse_filter_percentage),
OPT_END() OPT_END()
}; };
static double baseline_percent(struct hist_entry *he) static double baseline_percent(struct hist_entry *he)
{ {
struct hists *hists = he->hists; u64 total = hists__total_period(he->hists);
return 100.0 * he->stat.period / hists->stats.total_period;
return 100.0 * he->stat.period / total;
} }
static int hpp__color_baseline(struct perf_hpp_fmt *fmt, static int hpp__color_baseline(struct perf_hpp_fmt *fmt,
......
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