#!/usr/bin/perl use strict; use warnings; use Statistics::Descriptive; use Benchmark qw/ cmpthese /; use List::Util qw/ sum min max /; for my $len (100, 500, 1000) { my @scores = map {sprintf "%.3f", rand 29} 1 .. $len; print "\n\nNumber of scores: $len\n"; my $results = cmpthese (-1, { stat => sub { my $stat = Statistics::Descriptive::Full->new(); $stat->add_data(@scores); @scores = sort {$a <=> $b} @scores; my ($min, $max) = @scores[0, -1]; my $len = @scores; # number of scores my $mean = sum(@scores) / @scores; my $geo_mean = $stat->geometric_mean(); }, util => sub { my $len = @scores; # number of scores my $min = min @scores; my $max = max @scores; my $mean = sum(@scores) / @scores; my $geo_mean = geo_mean(@scores); }, }, ); } sub geo_mean { my $prod = 1; $prod *= $_ for @_; return $prod ** (1/ @_); }