Skip to content

Instantly share code, notes, and snippets.

@FROGGS
Created May 13, 2014 19:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FROGGS/70b742062c0be637e3b5 to your computer and use it in GitHub Desktop.
Save FROGGS/70b742062c0be637e3b5 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl6
grammar Ping { ... };
class Ping::Average { ... };
my $file = open 'MIRRORED.BY';
my %data;
my $key;
for $file.lines {
when /^ \s* '#'/ {
next
}
when /^ \s* (\S+) \s* ':' \s* $/ {
$key = $0;
}
when /^ \s* (\S+?) \s* '=' \s* \" (<-[\"]>*) \" \s* $/ {
%data{$key}{$0} = "$1";
}
when /\S/ { die "fail:\n$_" }
}
for %data.kv -> $name, $values is rw {
if ($values<dst_http> // $values<dst_ftp>) ~~ m,^ \w+ '://' $<host>=<-[/]>+ , {
$values<ping> = Ping.subparse(qqx{ping -n -c1 -W1 $<host>}, :actions(Ping::Average)).?made // Inf
}
}
my @top10 = %data.sort({$^a.value<ping> <=> $^b.value<ping>})[^10];
say join "\n", @top10.map(*.key ~ ': ' ~ *.value<ping> ~ 's');
grammar Ping {
rule TOP {
.+? <timing>+
}
rule timing {
'time=' <number> <unit>
}
token number {
<[\d\.]>+
}
token unit {
| ms
}
}
class Ping::Average {
method TOP($/) {
make ([+] $<timing>».made) / $<timing>.elems
}
method timing($/) {
make $<number>.made * $<unit>.made
}
method number($/) {
make ~$/
}
method unit($/) {
given ~$/ {
make 1/1000 when 'ms';
make 1 when 's';
}
}
}
@FROGGS
Copy link
Author

FROGGS commented May 13, 2014

time perl6-m mirrors.pl 
freenet.de: 0.0328s
de.leaseweb.net: 0.0352s
netcologne.de: 0.0354s
fht-esslingen.de: 0.0357s
ambiweb.de: 0.036s

real    1m32.353s
user    0m4.365s
sys 0m2.492s

funnily my top ten only has five entries O.o

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment