#!/usr/bin/perl use strict; use warnings; use List::Util qw(min max); use Text::CSV_XS; use GD::Graph::bars; use Data::Dumper; my $csv = Text::CSV_XS->new(); my @keys; my %data; open my $csv_fh, '<', 'Throughput.csv' or die; while ( my $row = $csv->getline($csv_fh) ) { if ( !@keys ) { @keys = @$row; next; } my %row; @row{@keys} = @$row; #next if $row{kernel} ne 'bsd.sp'; #next if $row{arch} ne 'AMD64'; #next if $row{size} ne '384'; my $graph = join ' ', 'Throughput', @row{qw{ kernel }}; my $item = join ' ', @row{qw{ arch nic }}; my $old = $data{$graph}{ $row{size} }{$item}; if ($old) { next if $old->{'Lost (%)'} < $row{'Lost (%)'}; } $data{$graph}{ $row{size} }{$item} = \%row; } close $csv_fh; #print Dumper \%data; foreach my $graph ( keys %data ) { foreach my $key ( 'Rx fps', 'Rx L2 bps', 'Rx L3 bps', 'Lost (%)', 'Throughput' ) { my @d; my @k; my @l; foreach my $size ( sort { $a <=> $b } keys %{ $data{$graph} } ) { push @l, $size; if ( !@k ) { @k = sort keys %{ $data{$graph}{$size} }; } for ( my $i = 0; $i < @k; $i++ ) { my $d = $data{$graph}{$size}{ $k[$i] }{$key}; push @{ $d[$i] }, $d; } } make_throughput_graph( "$graph - $key", \@k, \@l, \@d ); } } sub make_throughput_graph { my ( $title, $legend, $labels, $data ) = @_; #print Dumper \@_; exit; my @all_points = grep { $_ ne 'N/A' } map {@$_} @$data; my $min_point = min @all_points; my $max_point = max @all_points; my $graph = GD::Graph::bars->new( 800, 400 ); $graph->set( title => $title, transparent => 0, bargroup_spacing => 7, x_label => 'Frame Size', #show_values => 1, #values_vertical => 1, #y_min_value => $min_point * 0.9, #y_max_value => $max_point * 1.1, y_number_format => \&make_human_readable, ) or warn $graph->error; $graph->set_legend(@$legend) or warn $graph->error; my $gd = $graph->plot( [ $labels, @$data ] ) or die $graph->error; $title =~ s/\s+/_/g; open my $fh, '>', $title . '.png' or die $!; print $fh $gd->png; close $fh; } sub make_human_readable { my ($v) = @_; my @suffix = ( '', 'K', 'M', 'G', ); my $i = 0; while ( $v > 1000 ) { $v /= 1000; $i++; } $v = sprintf "%0.2f" . $suffix[$i], $v; return $v; }