Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7aaf6b35 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

perf diff: Add ratio computation way to compare hist entries



Adding -c option to select computation method with the current 'Delta'
computation as default. Current possible values are of this option are:
'delta' and 'ratio'.

Adding 'ratio' as new computation way to compare hist entries.  If
specified the 'Ratio' column is displayed with value 'r' computed as:

  r = A->period / B->period

with:
  - A/B being matching hist entry from first/second file specified
    (or perf.data/perf.data.old) respectively.
  - period being the hist entry period value

Signed-off-by: default avatarJiri Olsa <jolsa@redhat.com>
Cc: Andi Kleen <andi@firstfloor.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/1349448287-18919-3-git-send-email-jolsa@redhat.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent a06d143e
Loading
Loading
Loading
Loading
+33 −0
Original line number Original line Diff line number Diff line
@@ -76,6 +76,39 @@ OPTIONS
--baseline-only::
--baseline-only::
        Show only items with match in baseline.
        Show only items with match in baseline.


-c::
--compute::
        Differential computation selection - delta,ratio (default is delta).
        See COMPARISON METHODS section for more info.

COMPARISON METHODS
------------------
delta
~~~~~
If specified the 'Delta' column is displayed with value 'd' computed as:

  d = A->period_percent - B->period_percent

with:
  - A/B being matching hist entry from first/second file specified
    (or perf.data/perf.data.old) respectively.

  - period_percent being the % of the hist entry period value within
    single data file

ratio
~~~~~
If specified the 'Ratio' column is displayed with value 'r' computed as:

  r = A->period / B->period

with:
  - A/B being matching hist entry from first/second file specified
    (or perf.data/perf.data.old) respectively.

  - period being the hist entry period value


SEE ALSO
SEE ALSO
--------
--------
linkperf:perf-record[1]
linkperf:perf-record[1]
+50 −2
Original line number Original line Diff line number Diff line
@@ -26,6 +26,41 @@ static bool force;
static bool show_displacement;
static bool show_displacement;
static bool show_baseline_only;
static bool show_baseline_only;


enum {
	COMPUTE_DELTA,
	COMPUTE_RATIO,
	COMPUTE_MAX,
};

const char *compute_names[COMPUTE_MAX] = {
	[COMPUTE_DELTA] = "delta",
	[COMPUTE_RATIO] = "ratio",
};

static int compute;

static int setup_compute(const struct option *opt, const char *str,
			 int unset __maybe_unused)
{
	int *cp = (int *) opt->value;
	unsigned i;

	if (!str) {
		*cp = COMPUTE_DELTA;
		return 0;
	}

	for (i = 0; i < COMPUTE_MAX; i++)
		if (!strcmp(str, compute_names[i])) {
			*cp = i;
			return 0;
		}

	pr_err("Failed: '%s' is not computation method "
	       "(use 'delta' or 'ratio').\n", str);
	return -EINVAL;
}

static int hists__add_entry(struct hists *self,
static int hists__add_entry(struct hists *self,
			    struct addr_location *al, u64 period)
			    struct addr_location *al, u64 period)
{
{
@@ -262,6 +297,9 @@ static const struct option options[] = {
		    "Show position displacement relative to baseline"),
		    "Show position displacement relative to baseline"),
	OPT_BOOLEAN('b', "baseline-only", &show_baseline_only,
	OPT_BOOLEAN('b', "baseline-only", &show_baseline_only,
		    "Show only items with match in baseline"),
		    "Show only items with match in baseline"),
	OPT_CALLBACK('c', "compute", &compute, "delta,ratio (default delta)",
		     "Entries differential computation selection",
		     setup_compute),
	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
		    "dump raw trace in ASCII"),
		    "dump raw trace in ASCII"),
	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
@@ -290,9 +328,19 @@ static void ui_init(void)
	/* No overhead column. */
	/* No overhead column. */
	perf_hpp__column_enable(PERF_HPP__OVERHEAD, false);
	perf_hpp__column_enable(PERF_HPP__OVERHEAD, false);


	/* Display baseline/delta/displacement columns. */
	/* Display baseline/delta/ratio/displacement columns. */
	perf_hpp__column_enable(PERF_HPP__BASELINE, true);
	perf_hpp__column_enable(PERF_HPP__BASELINE, true);

	switch (compute) {
	case COMPUTE_DELTA:
		perf_hpp__column_enable(PERF_HPP__DELTA, true);
		perf_hpp__column_enable(PERF_HPP__DELTA, true);
		break;
	case COMPUTE_RATIO:
		perf_hpp__column_enable(PERF_HPP__RATIO, true);
		break;
	default:
		BUG_ON(1);
	};


	if (show_displacement)
	if (show_displacement)
		perf_hpp__column_enable(PERF_HPP__DISPL, true);
		perf_hpp__column_enable(PERF_HPP__DISPL, true);
+28 −0
Original line number Original line Diff line number Diff line
@@ -266,6 +266,33 @@ static int hpp__entry_delta(struct perf_hpp *hpp, struct hist_entry *he)
	return scnprintf(hpp->buf, hpp->size, fmt, buf);
	return scnprintf(hpp->buf, hpp->size, fmt, buf);
}
}


static int hpp__header_ratio(struct perf_hpp *hpp)
{
	const char *fmt = symbol_conf.field_sep ? "%s" : "%14s";

	return scnprintf(hpp->buf, hpp->size, fmt, "Ratio");
}

static int hpp__width_ratio(struct perf_hpp *hpp __maybe_unused)
{
	return 14;
}

static int hpp__entry_ratio(struct perf_hpp *hpp, struct hist_entry *he)
{
	struct hist_entry *pair = he->pair;
	double new_period = he->stat.period;
	double old_period = pair ? pair->stat.period : 0;
	double ratio = pair ? new_period / old_period : 0;
	const char *fmt = symbol_conf.field_sep ? "%s" : "%14s";
	char buf[32] = " ";

	if (ratio > 0.0)
		scnprintf(buf, sizeof(buf), "%+14.6F", ratio);

	return scnprintf(hpp->buf, hpp->size, fmt, buf);
}

static int hpp__header_displ(struct perf_hpp *hpp)
static int hpp__header_displ(struct perf_hpp *hpp)
{
{
	return scnprintf(hpp->buf, hpp->size, "Displ.");
	return scnprintf(hpp->buf, hpp->size, "Displ.");
@@ -311,6 +338,7 @@ struct perf_hpp_fmt perf_hpp__format[] = {
	{ .cond = false, HPP__PRINT_FNS(samples) },
	{ .cond = false, HPP__PRINT_FNS(samples) },
	{ .cond = false, HPP__PRINT_FNS(period) },
	{ .cond = false, HPP__PRINT_FNS(period) },
	{ .cond = false, HPP__PRINT_FNS(delta) },
	{ .cond = false, HPP__PRINT_FNS(delta) },
	{ .cond = false, HPP__PRINT_FNS(ratio) },
	{ .cond = false, HPP__PRINT_FNS(displ) }
	{ .cond = false, HPP__PRINT_FNS(displ) }
};
};


+1 −0
Original line number Original line Diff line number Diff line
@@ -141,6 +141,7 @@ enum {
	PERF_HPP__SAMPLES,
	PERF_HPP__SAMPLES,
	PERF_HPP__PERIOD,
	PERF_HPP__PERIOD,
	PERF_HPP__DELTA,
	PERF_HPP__DELTA,
	PERF_HPP__RATIO,
	PERF_HPP__DISPL,
	PERF_HPP__DISPL,


	PERF_HPP__MAX_INDEX
	PERF_HPP__MAX_INDEX