mirror of https://github.com/CGAL/cgal
506 lines
15 KiB
Perl
Executable File
506 lines
15 KiB
Perl
Executable File
#!/usr/bin/perl -w
|
|
|
|
use Cwd;
|
|
use Getopt::Long;
|
|
use HTML::Element;
|
|
use HTML::Tree;
|
|
use XML::Parser;
|
|
use English;
|
|
|
|
my $help = 0;
|
|
my $nameLength = 32;
|
|
# my $root = $ENV{ROOT};
|
|
my $home = $ENV{HOME};
|
|
$home =~ s/\\/\//g; # replace '\' with '/';
|
|
my $logDir = $home . '/logs';
|
|
$logDir =~ s/\/+/\//g; # replace '//.../' with '/';
|
|
|
|
my $root = $ENV{ROOT};
|
|
my $dataDir = $root . '/data' . '/bench';
|
|
my $databaseFile = $dataDir . '/benchDb.xml';
|
|
|
|
$Getopt::Long::ignorecase = 0;
|
|
GetOptions("databaseFile=s" => \$databaseFile,
|
|
"help" => \$help,
|
|
"logFile=s" => \$logFile,
|
|
"logDir=s" => \$logDir,
|
|
"phpFile=s" => \$phpFile,
|
|
"nameLength=i" => \$nameLength,
|
|
) or die "Bad command line option!";
|
|
|
|
usage() if $help;
|
|
|
|
$databaseFile =$dataDir . '/' . $databaseFile unless -f $databaseFile;
|
|
|
|
die "Can't find file \"$databaseFile\"" unless -f $databaseFile;
|
|
|
|
my %Files = ();
|
|
my %Classes = ();
|
|
|
|
# Parse database file:
|
|
my $parser = new XML::Parser(ErrorContext => 2,
|
|
Handlers => {Start => \&start_handler,
|
|
End => \&end_handler,
|
|
Char => \&char_handler,
|
|
CdataStart => \&cdata_start,
|
|
CdataEnd => \&cdata_end
|
|
}
|
|
);
|
|
|
|
$parser->parsefile($databaseFile);
|
|
|
|
$logFile = findLogFile($logDir) if (!defined($logFile));
|
|
|
|
my $date = $logFile;
|
|
$date =~ s/bcgal_(.*)/$1/;
|
|
my $year = substr($date, 0, 2);
|
|
my $month = substr($date, 2, 2);
|
|
my $day = substr($date, 4, 2);
|
|
|
|
if (!defined($phpFile)) {
|
|
$phpFile = $logFile;
|
|
$phpFile =~ s/(.*)\.log/$1\.php/;
|
|
}
|
|
$logFile = $logDir . '/' . $logFile;
|
|
|
|
$h = HTML::Element->new('html');
|
|
|
|
$inc = HTML::Element->new("~pi",
|
|
text => 'php require \'include.php\';?');
|
|
|
|
$dec = HTML::Element->new("~declaration", text=>'DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"');
|
|
|
|
$head = HTML::Element->new('head');
|
|
|
|
# coomon base:
|
|
$php1 = HTML::Element->new("~pi",
|
|
text => 'php require $commonDir . \'/base.php\';?');
|
|
$head->push_content($php1);
|
|
|
|
# meta
|
|
$meta = HTML::Element->new('meta',
|
|
'http-equiv' => 'Content-Type',
|
|
content => 'text/html; charset=iso-8859-1');
|
|
$head->push_content($meta);
|
|
|
|
# link:
|
|
$link = HTML::Element->new('link',
|
|
title => 'CGAL style',
|
|
rel => 'stylesheet',
|
|
type => 'text/css',
|
|
href => 'benchmark.css');
|
|
$head->push_content($link);
|
|
|
|
# title:
|
|
$title = HTML::Element->new('title');
|
|
$title->push_content('CGAL at Tel-Aviv University - Members Page - Evaluation - benchmark');
|
|
$head->push_content($title);
|
|
|
|
$h->push_content($head);
|
|
|
|
$body = HTML::Element->new("~pi",
|
|
text => 'php echo \'<body background=\\\'\' . $imagesDir . \'/cgal-bg2.gif\\\'>\'; ?');
|
|
# $body = HTML::Element->new('body', background => '../../images/cgal-bg2.gif');
|
|
|
|
$a = HTML::Element->new('a', name => 'top');
|
|
$body->push_content($a);
|
|
|
|
$php2 = HTML::Element->new("~pi",
|
|
text => 'php require $commonDir . \'/header.php\';?');
|
|
$body->push_content($php2);
|
|
|
|
$center = HTML::Element->new('center');
|
|
|
|
$h1 = HTML::Element->new('h1');
|
|
$font = HTML::Element->new('font', color => '#0f0f80');
|
|
$font->push_content('Benchmarks ' . $day . '/' . $month . '/' . $year);
|
|
$h1->push_content($font);
|
|
$center->push_content($h1);
|
|
|
|
$body->push_content($center);
|
|
$table = HTML::Element->new('table', border => '1');
|
|
|
|
$tr = HTML::Element->new('tr');
|
|
|
|
$th_name = HTML::Element->new('th', align => 'middle', 'nowrap');
|
|
$th_name->push_content('Benchmark Name');
|
|
|
|
$th_time = HTML::Element->new('th', align => 'middle');
|
|
$th_time->push_content('Allocated Time in seconds');
|
|
|
|
$th_ops = HTML::Element->new('th', align => 'middle');
|
|
$th_ops->push_content('Number of Operations');
|
|
|
|
$th_total = HTML::Element->new('th', align => 'middle');
|
|
$th_total->push_content('Total Operation time in seconds');
|
|
|
|
$th_single = HTML::Element->new('th', align => 'middle');
|
|
$th_single->push_content('Single Operation time in seconds');
|
|
|
|
$th_num = HTML::Element->new('th', align => 'middle');
|
|
$th_num->push_content('Operations per second');
|
|
|
|
$tr->push_content($th_name);
|
|
$tr->push_content($th_time);
|
|
$tr->push_content($th_ops);
|
|
$tr->push_content($th_total);
|
|
$tr->push_content($th_single);
|
|
$tr->push_content($th_num);
|
|
|
|
$th_curves = HTML::Element->new('th', align => 'middle');
|
|
$th_curves->push_content('Number of Curves');
|
|
|
|
$th_vertices = HTML::Element->new('th', align => 'middle');
|
|
$th_vertices->push_content('Number of Vertices');
|
|
|
|
$th_halfedges = HTML::Element->new('th', align => 'middle');
|
|
$th_halfedges->push_content('Number of Halfedges');
|
|
|
|
$th_faces = HTML::Element->new('th', align => 'middle');
|
|
$th_faces->push_content('Number of Faces');
|
|
|
|
$tr->push_content($th_curves);
|
|
$tr->push_content($th_vertices);
|
|
$tr->push_content($th_halfedges);
|
|
$tr->push_content($th_faces);
|
|
|
|
$table->push_content($tr);
|
|
|
|
# loop
|
|
@cpus = ();
|
|
open(LOGFILE, "$logFile") or die "Can't open file: $logFile\n";
|
|
$cnt = 0;
|
|
%days = (Sun => 0, Mon => 1, Tue => 2, Wed => 3, Thu => 4, Fri => 5, Sat => 6);
|
|
while ($line = <LOGFILE>) {
|
|
next if $line =~ /^\s*$/; # skip empty lines
|
|
chop($line); # remove 'end of line'
|
|
if ($line =~ /^COMPILER NAME: (.*)/) {
|
|
$compilerName = $1; next;
|
|
} elsif ($line =~ /^COMPILER INFO: (.*)/) {
|
|
$compilerInfo = $1; next;
|
|
} elsif ($line =~ /^OS NAME: (.*)/) {
|
|
$osName = $1; next;
|
|
} elsif ($line =~ /^OS INFO: (.*)/) {
|
|
$osInfo = $1; next;
|
|
} elsif ($line =~ /^PROCESSOR: (.*)/) {
|
|
$procId = $1; next;
|
|
} elsif ($line =~ /^CPU SPEED: (.*)/) {
|
|
$cpus[$procId]{'cpuSpeed'} = $1; next;
|
|
} elsif ($line =~ /^CPU TYPE: (.*)/) {
|
|
$cpus[$procId]{'cpuType'} = $1; next;
|
|
} elsif ($line =~ /^PRIMARY DATA CACHE: (.*)/) {
|
|
$cpus[$procId]{'primDataCache'} = $1; next;
|
|
} elsif ($line =~ /^SECONDARY DATA CACHE: (.*)/) {
|
|
$cpus[$procId]{'secDataCache'} = $1; next;
|
|
} elsif ($line =~ /^INSTRUCTION CACHE: (.*)/) {
|
|
$cpus[$procId]{'instCache'} = $1; next;
|
|
} elsif ($line =~ /^MEM SIZE: (.*)/) {
|
|
$memSize = $1; next;
|
|
} elsif ($line =~ /^GFX BOARD: (.*)/) {
|
|
$gfxBoard = $1; next;
|
|
} elsif ($line =~ /^CGAL VERSION: (.*)/) {
|
|
$cgalVersion = $1; next;
|
|
} elsif ($line =~ /^LEDA VERSION: (.*)/) {
|
|
$ledaVersion = $1; next;
|
|
} elsif ($line =~ /^QT VERSION: (.*)/) {
|
|
$qtVersion = $1; next;
|
|
} elsif ($line =~ /^(Sun|Mon|Tue|Wed|Thu|Fri|Sat)/) {
|
|
@words = split ' ', $line;
|
|
if ($cnt == 0) {
|
|
@startTime = split /:/, $words[3];
|
|
$startDay = $days{$words[0]};
|
|
$cnt = 1;
|
|
} elsif ($cnt == 1) {
|
|
@endTime = split /:/, $words[3];
|
|
$endDay = $days{$words[0]};
|
|
$cnt = 2;
|
|
}
|
|
next;
|
|
}
|
|
$offset = 0;
|
|
$name = substr($line, $offset, $nameLength); $offset += $nameLength + 1;
|
|
$name =~ s/\s*$//;
|
|
|
|
# Specific:
|
|
$found = 0;
|
|
foreach $classItem (keys %Classes) {
|
|
$className = $Classes{$classItem}->{'name'};
|
|
$key = $Classes{$classItem}->{'key'};
|
|
next unless ($key);
|
|
if ($name =~ $key) {
|
|
$class = $className;
|
|
$time_class = $class . '_time';
|
|
$found = 1;
|
|
last;
|
|
}
|
|
}
|
|
|
|
next unless $found;
|
|
|
|
$time = substr($line, $offset, 8); $offset += 9;
|
|
$ops = substr($line, $offset, 8); $offset += 9;
|
|
$total = substr($line, $offset, 8); $offset += 9;
|
|
$single = substr($line, $offset, 8); $offset += 9;
|
|
$num = substr($line, $offset, 8); $offset += 9;
|
|
|
|
$tr = HTML::Element->new('tr');
|
|
|
|
$td_name = HTML::Element->new('td', align => 'left', 'nowrap');
|
|
$td_name->attr('class', $class) if defined($class);
|
|
$td_name->push_content($name);
|
|
|
|
$td_time = HTML::Element->new('td', align => 'right');
|
|
$td_time->attr('class', $class) if defined($class);
|
|
$td_time->push_content($time);
|
|
|
|
$td_ops = HTML::Element->new('td', align => 'right');
|
|
$td_ops->attr('class', $class) if defined($class);
|
|
$td_ops->push_content($ops);
|
|
|
|
$td_total = HTML::Element->new('td', align => 'right');
|
|
$td_total->attr('class', $class) if defined($class);
|
|
$td_total->push_content($total);
|
|
|
|
$td_single = HTML::Element->new('td', align => 'right');
|
|
$td_single->attr('class', $time_class) if defined($time_class);
|
|
$td_single->push_content($single);
|
|
|
|
$td_num = HTML::Element->new('td', align => 'right');
|
|
$td_num->attr('class', $class) if defined($class);
|
|
$td_num->push_content($num);
|
|
|
|
$tr->push_content($td_name);
|
|
$tr->push_content($td_time);
|
|
$tr->push_content($td_ops);
|
|
$tr->push_content($td_total);
|
|
$tr->push_content($td_single);
|
|
$tr->push_content($td_num);
|
|
|
|
$td_curves = HTML::Element->new('td', align => 'right');
|
|
$td_vertices = HTML::Element->new('td', align => 'right');
|
|
$td_halfedges = HTML::Element->new('td', align => 'right');
|
|
$td_faces = HTML::Element->new('td', align => 'right');
|
|
$fileName = $name;
|
|
$fileName =~ s/[^\(]*\(([^\)]*)\)?/$1/;
|
|
$curvesNum = '?';
|
|
$verticesNum = '?';
|
|
$halfedgesNum = '?';
|
|
$facesNum = '?';
|
|
if (defined($Files{$fileName})) {
|
|
my $fileAttrTable = $Files{$fileName};
|
|
$curvesNum = $fileAttrTable->{'curves'};
|
|
$verticesNum = $fileAttrTable->{'vertices'};
|
|
$halfedgesNum = $fileAttrTable->{'halfedges'};
|
|
$facesNum = $fileAttrTable->{'faces'};
|
|
}
|
|
$td_curves->push_content($curvesNum);
|
|
$tr->push_content($td_curves);
|
|
$td_vertices->push_content($verticesNum);
|
|
$tr->push_content($td_vertices);
|
|
$td_halfedges->push_content($halfedgesNum);
|
|
$tr->push_content($td_halfedges);
|
|
$td_faces->push_content($facesNum);
|
|
$tr->push_content($td_faces);
|
|
|
|
$table->push_content($tr);
|
|
}
|
|
close LOGFILE;
|
|
# end loop
|
|
|
|
$center->push_content($table);
|
|
$body->push_content($center);
|
|
|
|
$p = HTML::Element->new('p');
|
|
$body->push_content($p);
|
|
|
|
$table = HTML::Element->new('table', 'border' => '1');
|
|
$body->push_content($table);
|
|
|
|
# bench duration
|
|
benchDuration($table) if (defined(@startTime) && defined(@endTime) &&
|
|
defined($endDay) && defined($startDay));
|
|
|
|
addInfo($table, 'Operating System', $osName);
|
|
addInfo($table, 'System Information', $osInfo);
|
|
addInfo($table, 'Compiler name', $compilerName);
|
|
addInfo($table, 'Compiler info', $compilerInfo);
|
|
addInfo($table, 'Memory Size', $memSize);
|
|
addInfo($table, 'Graphics Board', $gfxBoard);
|
|
addInfo($table, 'CGAL Version', $cgalVersion);
|
|
addInfo($table, 'LEDA Version', $ledaVersion);
|
|
addInfo($table, 'QT Version', $qtVersion);
|
|
addInfo($table, 'Number of CPU\'s', $#cpus+1);
|
|
|
|
for $i (0 .. $#cpus) {
|
|
$cpuTable = HTML::Element->new('table');
|
|
addInfo($cpuTable, 'Speed', $cpus[$i]{'cpuSpeed'});
|
|
addInfo($cpuTable, 'Type', $cpus[$i]{'cpuType'});
|
|
addInfo($cpuTable, 'Primary Data Cache', $cpus[$i]{'primDataCache'});
|
|
addInfo($cpuTable, 'Secondary data Cache', $cpus[$i]{'secDataCache'});
|
|
addInfo($cpuTable, 'Instruction cache', $cpus[$i]{'instCache'});
|
|
addInfo($table, 'CPU ' . $i, $cpuTable);
|
|
}
|
|
|
|
$a2 = HTML::Element->new('a', href => '#top');
|
|
|
|
$img = HTML::Element->new("~pi",
|
|
text => 'php echo \'<img alt=\\\'[Top]\\\', align=\\\'middle\\\', border=0 src=\\\'\' . $iconsDir . \'/top.gif\\\'>\'; ?');
|
|
|
|
#$img = HTML::Element->new('img',
|
|
# src => '../../images/icons/top.gif',
|
|
# alt => '[Top]', align => 'middle', border => '0');
|
|
|
|
$a2->push_content($img);
|
|
$body->push_content($a2);
|
|
|
|
$php3 = HTML::Element->new("~pi",
|
|
text => 'php require $commonDir . \'/footer.php\';?');
|
|
$body->push_content($php3);
|
|
|
|
$h->push_content($body);
|
|
|
|
open (PHPFILE, ">$phpFile") or die "cannot open $phpFile: $! for writing\n";
|
|
print PHPFILE $inc->as_HTML('<>&',' ');
|
|
print PHPFILE $dec->as_HTML('<>&',' ');
|
|
print PHPFILE $h->as_HTML('<>&',' ');
|
|
close PHPFILE;
|
|
|
|
exit(0);
|
|
################
|
|
## End of main
|
|
################
|
|
|
|
################
|
|
sub usage {
|
|
printf "Usage: cgal_bench_log2html [options]\n";
|
|
printf " -databaseFile <file>\tset database xml file to <file>
|
|
-help\t\t\tprint this help message
|
|
-root <root>\t\tset ROOT. Default \$ROOT (env. var.)
|
|
-logDir <dir>\t\tset log directory. Default is $logDir
|
|
-logFile <file>\tset log file.
|
|
\t\t\tDefault is most recent match bcgal_*.log
|
|
-nameLength <length>\tset the length of the name field\n";
|
|
|
|
exit(0);
|
|
}
|
|
|
|
####
|
|
sub addInfo
|
|
{
|
|
my ($table,$name,$value) = @_;
|
|
$tr = HTML::Element->new('tr');
|
|
$td1 = HTML::Element->new('td');
|
|
$td2 = HTML::Element->new('td');
|
|
$b = HTML::Element->new('b');
|
|
$b->push_content($name);
|
|
$td1->push_content($b);
|
|
$td2->push_content($value);
|
|
$tr->push_content($td1);
|
|
$tr->push_content($td2);
|
|
$table->push_content($tr);
|
|
}
|
|
|
|
####
|
|
sub benchDuration {
|
|
my ($table) = @_;
|
|
$diffTime[0] = $endTime[0] - $startTime[0];
|
|
$diffTime[1] = $endTime[1] - $startTime[1];
|
|
$diffTime[2] = $endTime[2] - $startTime[2];
|
|
$diffDay = $endDay - $startDay;
|
|
if ($diffTime[2] < 0) {
|
|
$diffTime[2] += 60;
|
|
$diffTime[1]--;
|
|
}
|
|
if ($diffTime[1] < 0) {
|
|
$diffTime[1] += 60;
|
|
$diffTime[0]--;
|
|
}
|
|
if ($diffTime[0] < 0) {
|
|
$diffTime[0] += 24;
|
|
$diffDay--;
|
|
}
|
|
$diffDay += 7 if ($diffDay < 0);
|
|
|
|
$tr = HTML::Element->new('tr');
|
|
$td1 = HTML::Element->new('td');
|
|
$td2 = HTML::Element->new('td');
|
|
$b = HTML::Element->new('b');
|
|
$b->push_content('Bench Duration');
|
|
$td1->push_content($b);
|
|
$td2->push_content("$diffDay:$diffTime[0]:$diffTime[1]:$diffTime[2]");
|
|
$tr->push_content($td1);
|
|
$tr->push_content($td2);
|
|
$table->push_content($tr);
|
|
}
|
|
|
|
####
|
|
sub findLogFile {
|
|
my ($logDir) = @_;
|
|
opendir LOGDIR, $logDir or die "serious braindamage: $logDir $!";
|
|
@logFiles = grep /bcgal/, readdir LOGDIR;
|
|
closedir LOGDIR;
|
|
$year = 0;
|
|
$month = 0;
|
|
$day = 0;
|
|
$hour = 0;
|
|
$minute = 0;
|
|
|
|
foreach $newLogFile (@logFiles) {
|
|
next if !($newLogFile =~ /bcgal_([^\.%]*)\.log$/);
|
|
$date = $1;
|
|
$newYear = substr($date, 0, 2);
|
|
$newMonth = substr($date, 2, 2);
|
|
$newDay = substr($date, 4, 2);
|
|
|
|
$newHour = substr($date, 6, 2);
|
|
$newMinute = substr($date, 8, 2);
|
|
$newSecond = substr($date, 10, 2);
|
|
if (($newYear > $year) ||
|
|
(($newYear == $year) && ($newMonth > $month)) ||
|
|
(($newYear == $year) && ($newMonth == $month) && ($newDay > $day)) ||
|
|
(($newYear == $year) && ($newMonth == $month) && ($newDay == $day) &&
|
|
($newHour > $hour)) ||
|
|
(($newYear == $year) && ($newMonth == $month) && ($newDay == $day) &&
|
|
($newHour == $hour) && ($newMinute > $minute)) ||
|
|
(($newYear == $year) && ($newMonth == $month) && ($newDay == $day) &&
|
|
($newHour == $hour) && ($newMinute == $minute) &&
|
|
($newSecond > $second)))
|
|
{
|
|
$year = $newYear;
|
|
$month = $newMonth;
|
|
$day = $newDay;
|
|
$hour = $newHour;
|
|
$minute = $newMinute;
|
|
$second = $newSecond;
|
|
$logFile = $newLogFile;
|
|
}
|
|
}
|
|
return $logFile;
|
|
}
|
|
|
|
#
|
|
sub start_handler
|
|
{
|
|
my ($xp, $currentElement) = @_;
|
|
|
|
# Initialize attributes:
|
|
$attrTable = {};
|
|
|
|
# Update attributes:
|
|
while (@_) {
|
|
my $id = shift;
|
|
my $val = shift;
|
|
$val = $xp->xml_escape($val, "'");
|
|
$attrTable->{$id} = $val;
|
|
}
|
|
$Files{$attrTable->{'name'}} = $attrTable if ($currentElement eq 'file');
|
|
$Classes{$attrTable->{'name'}} = $attrTable if ($currentElement eq 'class');
|
|
}
|
|
|
|
#
|
|
sub end_handler { my ($xp, $currentElement) = @_; }
|
|
sub char_handler { my ($xp, $data) = @_; }
|
|
sub cdata_start { my $xp = shift; }
|
|
sub cdata_end { my $xp = shift; }
|
|
|