#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use List::Util qw(min max); use Text::CSV_XS; #use GD::Graph; use lib 'gd--graph--ohlc'; use candlesticks; my $csv = Text::CSV_XS->new(); my @keys; my %data; open my $csv_fh, '<', 'Latency.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 @data = ( ( $row{AveLatency} + $row{StdDeviation} / 2 ), $row{MaxLatency}, $row{MinLatency}, ( $row{AveLatency} - $row{StdDeviation} / 2 ), ); for (@data) { if ($_ > 2000) { $_ = 2000 } } my $graph = join ' ', 'Latency', @row{ qw{ kernel size } }, 'Byte Frames'; my $item = join ' ', @row{ qw{ arch nic } }; $data{ $graph }{ $row{load} } ||= []; push @{ $data{ $graph }{ $row{load} } }, [ $item => \@data ]; } close $csv_fh; #print Dumper \%data; exit; foreach my $graph (sort keys %data) { my @d; my @k; my @l; foreach my $load (sort { $a <=> $b } keys %{ $data{$graph} }) { push @l, sprintf '%d%%', $load; for (my $i = 0; $i < @{ $data{$graph}{$load} }; $i++) { my $d = $data{$graph}{$load}[$i]; $k[$i] = $d->[0]; push @{ $d[$i] }, $d->[1]; } } make_graph( $graph, \@k, \@l, \@d ); } sub make_graph { my ( $title, $legend, $labels, $data ) = @_; #print Dumper \@_; exit; my @all_points = grep { $_ ne 'N/A' } map { @$_ } map { @$_ } @$data; my $min_point = min @all_points; my $max_point = max @all_points; my $graph = GD::Graph::candlesticks->new( 800, 400 ); $graph->set( #x_labels_vertical => 1, #x_label_skip => @$items + 1, x_label => '% Load', y_label => 'RTT', title => $title, transparent => 0, overwrite => 0, 'long_ticks' => 1, 'x_ticks' => 0, #candlestick_width => 7, #dclrs => [qw(green pink blue cyan)], #borderclrs => [qw(green pink blue cyan)], #cycle_clrs => 2, #y_min_value => $min_point - 0.2, #y_max_value => $max_point + 0.2, y_min_value => 0, y_max_value => 2000, #y_number_format => '%d%%', ) or warn $graph->error; $graph->set_legend(@$legend) or warn $graph->error; my $data_candlesticks = [ $labels, @$data ]; my $gd = $graph->plot($data_candlesticks) or die $graph->error; $title =~ s/\s+/_/g; open my $fh, '>', $title . '.png' or die $!; print $fh $gd->png; close $fh; }