#!/usr/bin/perl use strict; use Time::HiRes qw(time); use Term::ANSIColor; use Syntax::Highlight::Engine::Kate; my $cycles = 5; my %langs = ( '.desktop' => "highlight.desktop", 'AHDL' => "highlight.ahdl", 'ASP' => "highlight.asp", 'AVR Assembler' => "highlight.asm", 'AWK' => "highlight.awk", 'Bash' => "highlight.sh", 'BibTeX' => "highlight.bib", 'C++' => "highlight.cpp", 'CMake' => "highlight.cmake", 'CSS' => "highlight.css", 'Clipper' => "highlight.prg", 'Common Lisp' => "highlight.lisp", 'Doxygen' => "highlight.dox", 'Eiffel' => "highlight.e", 'Euphoria' => "highlight.exu", 'Fortran' => "highlight.f90", 'GLSL' => "highlight.glsl", 'HTML' => "highlight.html", 'Haskell' => "highlight.hs", 'Intel x86 (NASM)' => "highlight.asm", 'JSP' => "highlight.jsp", 'Java' => "highlight.java", 'JavaScript' => "highlight.js", 'LaTeX' => "highlight.tex", 'Lex/Flex' => "highlight.lex", 'LilyPond' => "highlight.ly", 'Literate Haskell' => "highlight.hs", 'Matlab' => "highlight.m", 'Octave' => "highlight.m", 'PHP (HTML)' => "highlight.php", 'POV-Ray' => "highlight.pov", 'Perl' => "highlight.pl", 'PicAsm' => "highlight.asm", 'Pike' => "highlight.pike", 'PostScript' => "highlight.ps", 'PureBasic' => "highlight.pb", 'Python' => "highlight.py", 'Quake Script' => "highlight.rib", 'Ruby' => "highlight.rb", 'Scheme' => "highlight.scheme", 'Spice' => "highlight.sp", 'Stata' => "highlight.do", 'Tcl/Tk' => "highlight.tcl", 'UnrealScript' => "highlight.uc", 'VRML' => "highlight.wrl", 'XML' => "highlight.xml", 'xslt' => "highlight.xsl", 'yacas' => "highlight.y", ); my $k = new Syntax::Highlight::Engine::Kate( substitutions => { "\n" => color('reset') . "\n", }, format_table => { Alert => [color('white bold on_green'), color('reset')], BaseN => [color('green'), color('reset')], BString => [color('red bold'), color('reset')], Char => [color('magenta'), color('reset')], Comment => [color('white bold on_blue'), color('reset')], DataType => [color('blue'), color('reset')], DecVal => [color('blue bold'), color('reset')], Error => [color('yellow bold on_red'), color('reset')], Float => [color('blue bold'), color('reset')], Function => [color('yellow bold on_blue'), color('reset')], IString => [color('red'), color('reset')], Keyword => [color('bold'), color('reset')], Normal => [color('reset'), color('reset')], Operator => [color('green'), color('reset')], Others => [color('yellow bold on_green'), color('reset')], RegionMarker => [color('black on_yellow bold'), color('reset')], Reserved => [color('magenta on_blue'), color('reset')], String => [color('red'), color('reset')], Variable => [color('blue on_red bold'), color('reset')], Warning => [color('green bold on_red'), color('reset')], }, ); my @langl = sort keys %langs; my %results = (); my $cycle = 1; while ($cycle <= $cycles) { foreach my $ln (@langl) { print "testing language $ln\n"; my $fl = $langs{$ln}; my $txt = ""; open(TST, ") { $txt = $txt . $_; }; close TST; unless (exists $results{$ln}) { $results{$ln} = { size => length($txt), hlmax => 0, hlmin => '', hltot => 0, fmmax => 0, fmmin => '', fmtot => 0, }; } my $r = $results{$ln}; my $cs = $cycle * $r->{'size'}; print "$cycle $ln $cs" . " bytes: \n"; $k->language($ln); $k->reset; my $start1 = time; # print $txt; my @dummy = $k->highlight($txt); my $hlbench = time - $start1; $r->{'hltot'} = $r->{'hltot'} + $hlbench; if ($hlbench > $r->{'hlmax'}) { $r->{'hlmax'} = $hlbench }; if (($r->{'hlmin'} eq '') or ($hlbench < $r->{'hlmin'})) { $r->{'hlmin'} = $hlbench } my $hltp = 0; if ($r->{'hltot'} > 0) { $hltp = int($cs / $r->{'hltot'}); } print "highlighting hltot " . $r->{'hltot'} . " seconds, avg throughput $hltp bytes/second\n" ; $k->reset; my $start2 = time; # print $txt; my $rtxt = $k->highlightText($txt); # print $rtxt; my $fmbench = time - $start2; $r->{'fmtot'} = $r->{'fmtot'} + $fmbench; if ($fmbench > $r->{'fmmax'}) { $r->{'fmmax'} = $fmbench }; if (($r->{'fmmin'} eq '') or ($fmbench < $r->{'fmmin'})) { $r->{'fmmin'} = $fmbench } my $fmtp = 0; if ($r->{'fmtot'} > 0) { $fmtp = int($cs / $r->{'fmtot'}); } print "formatting fmtot " . $r->{'fmtot'} . " seconds, avg throughput $fmtp bytes/second\n"; } $cycle ++; } my %modes = ( hl => '\$kate->highlight', fm => '\$kate->highlightText', ); print "\n====================================================\n"; print "BENCHMARK REPORT FOR Sybtax::Highlight::Engine::Kate\n"; print "====================================================\n\n"; foreach my $md ('hl', 'fm') { my $mt = $modes{$md}; print "Report for $mt, done $cycles iterations.\n\n"; print "language size min max total throughput\n"; print " testfile time time time (bytes/second)\n\n"; my $mintot = 0; my $maxtot = 0; my $tottot = 0; my $siztot = 0; foreach my $l (sort keys %results) { my $txt = $l; $txt = addspaces($txt, 16); my $r = $results{$l}; $txt = $txt . $r->{'size'}; $siztot = $siztot + $r->{'size'}; $mintot = $mintot + $r->{$md . 'min'}; $maxtot = $maxtot + $r->{$md . 'max'}; $tottot = $tottot + $r->{$md . 'tot'}; $txt = addspaces($txt, 28); $txt = $txt . sprintf("%4f", $r->{$md . 'min'}); $txt = addspaces($txt, 40); $txt = $txt . sprintf("%4f", $r->{$md . 'max'}); $txt = addspaces($txt, 52); $txt = $txt . sprintf("%4f", $r->{$md . 'tot'}); $txt = addspaces($txt, 64); $txt = $txt . calcaverage($r->{'size'}, $r->{$md . 'tot'}); print "$txt\n"; } print "\n"; my $txtt = addspaces('Totals', 16); $txtt = $txtt . $siztot; $txtt = addspaces($txtt, 28); $txtt = $txtt . sprintf("%4f", $mintot); $txtt = addspaces($txtt, 40); $txtt = $txtt . sprintf("%4f", $maxtot); $txtt = addspaces($txtt, 52); $txtt = $txtt . sprintf("%4f", $tottot); $txtt = addspaces($txtt, 64); $txtt = $txtt . calcaverage($siztot, $tottot); print "$txtt\n"; my $txta = addspaces('Averages', 16); my $numlang = @langl; if ($numlang > 0) { $txta = $txta . int($siztot/$numlang); $txta = addspaces($txta, 28); $txta = $txta . sprintf("%4f", $mintot/$numlang); $txta = addspaces($txta, 40); $txta = $txta . sprintf("%4f", $maxtot/$numlang); $txta = addspaces($txta, 52); $txta = $txta . sprintf("%4f", $tottot/$numlang); } print"$txta\n"; print "====================================================\n\n"; } sub addspaces { my $t = shift; my $l = shift; while (length($t) < $l) { $t = "$t "; } return $t; } sub calcaverage { my ($size, $time) = @_; if ($time eq 0) { return 'division by 0' } else { return int(($cycles * $size)/$time); } }