On Mon, Aug 27, 2012 at 05:51:46PM +0800, Dong Hao wrote:Sorry for my late response, Andrew and thank you very much for your comments. We will try
<snip>
+struct event_stats {How about moving the stats functions from builtin-stat.c to e.g.
+ u64 count;
+ u64 time;
+
+ /* used to calculate stddev. */
+ double mean;
+ double M2;
+};
util/stats.c, and then reusing them? Then this struct (which I would
rename to kvm_event_stats) would look like this
struct kvm_event_stats {
u64 time;
struct stats stats;
};
of course the get_event_ accessor generators would need tweaking
<snip>
+static void update_event_stats(struct event_stats *stats, u64 time_diff)Reusing stats would allow this to become just
+{
+ double delta;
+
+ stats->count++;
+ stats->time += time_diff;
+
+ delta = time_diff - stats->mean;
+ stats->mean += delta / stats->count;
+ stats->M2 += delta*(time_diff - stats->mean);
+}
static void update_event_stats(struct kvm_event_stats *stats, u64 time_diff)
{
update_stats(&kvm_stats->stats, time_diff);
kvm_stats->time += time_diff;
}
+This function's name implies it returns the stddev, but it returns the
+static double event_stats_stddev(int vcpu_id, struct kvm_event *event)
+{
+ struct event_stats *stats = &event->total;
+ double variance, variance_mean, stddev;
+
+ if (vcpu_id != -1)
+ stats = &event->vcpu[vcpu_id];
+
+ BUG_ON(!stats->count);
+
+ variance = stats->M2 / (stats->count - 1);
+ variance_mean = variance / stats->count;
+ stddev = sqrt(variance_mean);
+
+ return stddev * 100 / stats->mean;
relative stddev instead. Maybe rename it? This would be simplified
with code reuse too to basically just
return stddev_stats(&kvm_stats->stats) * 100 / kvm_stats->stats.mean;
Drew