#!/usr/bin/perl -w
#
# Dieser Benchmark benutzt den Batchmodus von dig
#

use strict;
use Time::HiRes('gettimeofday','tv_interval');

my $N=100000;
my $F="/tmp/dig-$$";
my $CMD="dig \@127.0.0.1 -p 53000 -f /tmp/dig-$$ +noall +stats +cmd >/tmp/dig-$$-out";
my @CHARPOOL=('A'..'Z', 'a'..'z', 0..9);

$|=1;
print "Datei $F erzeugen ($N Domains)...";
open(TMP,">$F");

foreach(1..$N)
	{
	my $rnd='';
	for(my $i=0; $i<10; $i++)
		{
		$rnd.=(@CHARPOOL)[rand(51)];
		}
	print TMP "www.kacke-${rnd}.de\n";
	}
close(TMP);
print "done\n";
print "Anfragen stellen ($CMD)...";
my $t=[gettimeofday];
system($CMD);
my $used=tv_interval($t);
print "\n\n$used Sekunden (".($N/$used)."/s)\n";
unlink("/tmp/dig-$$");

DetailedStats("/tmp/dig-$$-out");

exit(0);

sub DetailedStats
{
my $fname=shift;
my($min,$max,$timeouts,$cnt)=(0,0,0,0);

local($/);
open(FH,$fname) || die($!);
my $str=<FH>;
close(FH);
#unlink($fname);

my @times=();
foreach my $rec(split(/; \<\<\>\> DiG [^\n]+/,$str))
	{
	my @lns=split(/\n/,$rec);
	if(@lns>0)
		{
		$cnt++;
		foreach(@lns)
			{
			if(m/^;; Query time\: (\d+) msec/)
				{
				push(@times,$1);
				}
			elsif(m/^;; connection timed out; no servers could be reached/)
				{
				$timeouts++;
				}
			else
				{
				#warn "unknown line: $_\n";
				}
			}
		}
	}

($min,$max)=($times[0],$times[0]);
foreach(@times)
	{
	if($_ < $min)
		{
		$min=$_;
		}
	elsif($_ >= $max)
		{
		$max=$_;
		}
	}

print "Detailstatistiken\n";
print "Anfragen          : $cnt\n";
print "Timeouts          : $timeouts\n";
print "genommene Zeiten  : ".scalar(@times)."\n";
print "langsamste Antwort: $max msec\n";
print "schnellste Antwort: $min msec\n";

return 1;
}
