All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Ahern <dsahern@gmail.com>
To: Dong Hao <haodong@linux.vnet.ibm.com>
Cc: acme@infradead.org, mtosatti@redhat.com, avi@redhat.com,
	mingo@kernel.org, linux-kernel@vger.kernel.org,
	kvm@vger.kernel.org, xiaoguangrong@linux.vnet.ibm.com,
	runzhen@linux.vnet.ibm.com
Subject: Re: [PATCH v8 2/3] perf: move stat related code to util/stat.c
Date: Tue, 18 Sep 2012 08:01:40 -0600	[thread overview]
Message-ID: <50587EC4.7070804@gmail.com> (raw)
In-Reply-To: <1347870675-31495-3-git-send-email-haodong@linux.vnet.ibm.com>

On 9/17/12 2:31 AM, Dong Hao wrote:
> From: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
>
> Then, the code can be shared between kvm events and perf stat
>
> [ Dong Hao <haodong@linux.vnet.ibm.com>: rebase it on acme's git tree ]
> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
> Signed-off-by: Dong Hao <haodong@linux.vnet.ibm.com>
> ---
>   tools/perf/Makefile       |    1 +
>   tools/perf/builtin-stat.c |   56 +------------------------------------------
>   tools/perf/util/stat.c    |   57 +++++++++++++++++++++++++++++++++++++++++++++
>   tools/perf/util/stat.h    |   16 ++++++++++++
>   4 files changed, 76 insertions(+), 54 deletions(-)
>   create mode 100644 tools/perf/util/stat.c
>   create mode 100644 tools/perf/util/stat.h
>
> diff --git a/tools/perf/Makefile b/tools/perf/Makefile
> index 209774b..5077f8e 100644
> --- a/tools/perf/Makefile
> +++ b/tools/perf/Makefile
> @@ -406,6 +406,7 @@ LIB_OBJS += $(OUTPUT)util/target.o
>   LIB_OBJS += $(OUTPUT)util/rblist.o
>   LIB_OBJS += $(OUTPUT)util/intlist.o
>   LIB_OBJS += $(OUTPUT)util/vdso.o
> +LIB_OBJS += $(OUTPUT)util/stat.o
>
>   LIB_OBJS += $(OUTPUT)ui/helpline.o
>   LIB_OBJS += $(OUTPUT)ui/hist.o
> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> index dab347d..3c43a35 100644
> --- a/tools/perf/builtin-stat.c
> +++ b/tools/perf/builtin-stat.c
> @@ -51,13 +51,13 @@
>   #include "util/evsel.h"
>   #include "util/debug.h"
>   #include "util/color.h"
> +#include "util/stat.h"
>   #include "util/header.h"
>   #include "util/cpumap.h"
>   #include "util/thread.h"
>   #include "util/thread_map.h"
>
>   #include <sys/prctl.h>
> -#include <math.h>
>   #include <locale.h>
>
>   #define DEFAULT_SEPARATOR	" "
> @@ -199,11 +199,6 @@ static int			output_fd;
>
>   static volatile int done = 0;
>
> -struct stats
> -{
> -	double n, mean, M2;
> -};
> -
>   struct perf_stat {
>   	struct stats	  res_stats[3];
>   };
> @@ -220,50 +215,6 @@ static void perf_evsel__free_stat_priv(struct perf_evsel *evsel)
>   	evsel->priv = NULL;
>   }
>
> -static void update_stats(struct stats *stats, u64 val)
> -{
> -	double delta;
> -
> -	stats->n++;
> -	delta = val - stats->mean;
> -	stats->mean += delta / stats->n;
> -	stats->M2 += delta*(val - stats->mean);
> -}
> -
> -static double avg_stats(struct stats *stats)
> -{
> -	return stats->mean;
> -}
> -
> -/*
> - * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
> - *
> - *       (\Sum n_i^2) - ((\Sum n_i)^2)/n
> - * s^2 = -------------------------------
> - *                  n - 1
> - *
> - * http://en.wikipedia.org/wiki/Stddev
> - *
> - * The std dev of the mean is related to the std dev by:
> - *
> - *             s
> - * s_mean = -------
> - *          sqrt(n)
> - *
> - */
> -static double stddev_stats(struct stats *stats)
> -{
> -	double variance, variance_mean;
> -
> -	if (!stats->n)
> -		return 0.0;
> -
> -	variance = stats->M2 / (stats->n - 1);
> -	variance_mean = variance / stats->n;
> -
> -	return sqrt(variance_mean);
> -}
> -
>   static struct stats runtime_nsecs_stats[MAX_NR_CPUS];
>   static struct stats runtime_cycles_stats[MAX_NR_CPUS];
>   static struct stats runtime_stalled_cycles_front_stats[MAX_NR_CPUS];
> @@ -559,10 +510,7 @@ static int run_perf_stat(int argc __maybe_unused, const char **argv)
>
>   static void print_noise_pct(double total, double avg)
>   {
> -	double pct = 0.0;
> -
> -	if (avg)
> -		pct = 100.0*total/avg;
> +	double pct = rel_stddev_stats(total, avg);
>
>   	if (csv_output)
>   		fprintf(output, "%s%.2f%%", csv_sep, pct);
> diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
> new file mode 100644
> index 0000000..2374212
> --- /dev/null
> +++ b/tools/perf/util/stat.c
> @@ -0,0 +1,57 @@
> +#include <math.h>
> +
> +#include "stat.h"
> +
> +void update_stats(struct stats *stats, u64 val)
> +{
> +	double delta;
> +
> +	stats->n++;
> +	delta = val - stats->mean;
> +	stats->mean += delta / stats->n;
> +	stats->M2 += delta*(val - stats->mean);
> +}
> +
> +double avg_stats(struct stats *stats)
> +{
> +	return stats->mean;
> +}
> +
> +/*
> + * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
> + *
> + *       (\Sum n_i^2) - ((\Sum n_i)^2)/n
> + * s^2 = -------------------------------
> + *                  n - 1
> + *
> + * http://en.wikipedia.org/wiki/Stddev
> + *
> + * The std dev of the mean is related to the std dev by:
> + *
> + *             s
> + * s_mean = -------
> + *          sqrt(n)
> + *
> + */
> +double stddev_stats(struct stats *stats)
> +{
> +	double variance, variance_mean;
> +
> +	if (!stats->n)
> +		return 0.0;
> +
> +	variance = stats->M2 / (stats->n - 1);
> +	variance_mean = variance / stats->n;
> +
> +	return sqrt(variance_mean);
> +}
> +
> +double rel_stddev_stats(double stddev, double avg)
> +{
> +	double pct = 0.0;
> +
> +	if (avg)
> +		pct = 100.0 * stddev/avg;
> +
> +	return pct;
> +}

rel_stddev_stats should take the struct stats as an input and use 
elements from it to compute the return value. perf-stat's relative 
stddev sites can be fixed later.


> diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
> new file mode 100644
> index 0000000..588367c
> --- /dev/null
> +++ b/tools/perf/util/stat.h
> @@ -0,0 +1,16 @@
> +#ifndef __PERF_STATS_H
> +#define __PERF_STATS_H
> +
> +#include "types.h"
> +
> +struct stats
> +{
> +	double n, mean, M2;
> +};
> +
> +void update_stats(struct stats *stats, u64 val);
> +double avg_stats(struct stats *stats);
> +double stddev_stats(struct stats *stats);
> +double rel_stddev_stats(double stddev, double avg);
> +
> +#endif
>


  reply	other threads:[~2012-09-18 14:01 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-17  8:31 [PATCH v8 0/3] KVM: perf: kvm events analysis tool Dong Hao
2012-09-17  8:31 ` [PATCH v8 1/3] KVM: x86: export svm/vmx exit code and vector code to userspace Dong Hao
2012-09-17 14:58   ` Arnaldo Carvalho de Melo
2012-09-20 12:51     ` Marcelo Tosatti
2012-09-27  4:26   ` [tip:perf/core] KVM: x86: Export svm/ vmx " tip-bot for Xiao Guangrong
2012-09-17  8:31 ` [PATCH v8 2/3] perf: move stat related code to util/stat.c Dong Hao
2012-09-18 14:01   ` David Ahern [this message]
2012-09-18 19:18   ` David Ahern
2012-09-19  1:53     ` Xiao Guangrong
2012-09-19  4:00       ` David Ahern
2012-09-19 15:18   ` [tip:perf/core] perf stat: Move stats " tip-bot for Xiao Guangrong
2012-09-17  8:31 ` [PATCH v8 3/3] KVM: perf: kvm events analysis tool Dong Hao
2012-09-20 13:34   ` David Ahern
2012-09-27  4:27   ` [tip:perf/core] perf kvm: Events " tip-bot for Xiao Guangrong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50587EC4.7070804@gmail.com \
    --to=dsahern@gmail.com \
    --cc=acme@infradead.org \
    --cc=avi@redhat.com \
    --cc=haodong@linux.vnet.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=runzhen@linux.vnet.ibm.com \
    --cc=xiaoguangrong@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.