#!/usr/bin/perl

use strict;

my %rev;

for my $f (@ARGV)
{
	open(my $fh, '<', $f) or next;
	next unless <$fh> =~ /mpg123 benchmark/;
	my %best = ( asm=>[], gen=>[] ); # name,val pairs
	while(<$fh>)
	{
		next if /^#/;
		next unless /\S/;
		chomp;
		my ($dec, @sec) = split(/\s+/);
		store_best($best{ $dec =~ /^generic.*$/ ? 'gen' : 'asm'}, \@sec, $dec);
	}
	if(@{$best{asm}} and @{$best{gen}} and @{$best{asm}} == @{$best{gen}})
	{
		my $ratio = $best{gen}[0][1] / $best{asm}[0][1];
		my $asm = $best{asm}[0][0];
		my $rev = mpg123_rev($f);
		for my $i (1 .. $#{$best{asm}})
		{
			my $nr = $best{gen}[$i][1] / $best{asm}[$i][1];
			if($nr > $ratio)
			{
				$ratio = $nr;
				$asm = $best{asm}[$i][0];
			}
		}
		print sprintf("%.2f", $ratio)." speedup with $asm rev $rev $f\n";
	}
}

sub store_best
{
	my ($best, $sec, $dec) = @_;
	if(@{$best})
	{
		for my $i (0 .. $#{$best})
		{
			if($sec->[$i] > 0 and $sec->[$i] < $best->[$i][1])
			{
				$best->[$i] = [$dec, $sec->[$i]];
			}
		}
	} else
	{
		@{$best} = map { [$dec, $_] } @{$sec};
	}
}

sub mpg123_rev
{
	my $f = shift;
	return $1
		if $f =~ /mpg123-r(\d+)/;
	if($f =~ /mpg123-(\d[\d.]+)/)
	{
		my $rev = `svn info --show-item last-changed-revision svn://scm.orgis.org/mpg123/tags/$1/`;
		chomp $rev;
		return $rev;
	}
	return 0;
}

__END__
#mpg123 benchmark (user CPU time in seconds for decoding)
#decoder	t_s16/s	t_f32/s
AVX	2.01	1.93
x86-64	2.06	2.07
generic	2.87	3.25
generic_dither	3.00	3.20
