The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
#!d:\perl\bin\perl.exe 

# -- SOAP::Lite -- soaplite.com -- Copyright (C) 2001 Paul Kulchenko --

use strict;
use Benchmark;
use SOAP::Lite on_fault => sub {my($soap, $res) = @_; die ref $res ? $res->faultdetail : $soap->transport->status, "\n"};
use My::Examples;

my %dests = (
  local              => ['local://localhost/cgi-bin/soap.cgi' => 'http://www.soaplite.com/My/Examples'],
  mod_perl           => ['http://localhost/soap/' => 'http://www.soaplite.com/My/Examples'],
  CGI                => ['http://localhost/cgi-bin/soap.cgi' => 'http://www.soaplite.com/My/Examples'],
  daemon             => ['http://localhost:81/' => 'http://www.soaplite.com/My/Examples'],
  'Apache::Registry' => ['http://localhost/mod_perl/soap.mod_cgi' => 'http://www.soaplite.com/My/Examples'],
  tcpip              => ['tcp://localhost:82' => 'http://www.soaplite.com/My/Examples'],
  direct             => ['' => 'My::Examples'],
);

my $s;

my %tests = (
  simple => sub {$s->getStateName(1)},
  array =>  sub {$s->getStateName((1) x 100)},
  string =>  sub {$s->getStateName(1 x 100)},
);

my $testnum = 3;
my $testtime = 5;
my %result;

print STDERR <<DISCLAIMER;

This test should be used only for comparison different Perl server
implementations running in your environment. 

DISCLAIMER

print STDERR "All tests may take up to ", keys(%dests) * keys(%tests) * $testnum * $testtime, " sec\n";

foreach my $dest (keys %dests) {
  my($proxy, $uri) = @{$dests{$dest}};
  $s = $proxy ? SOAP::Lite->proxy($proxy)->uri($uri) : $uri;
  foreach my $test (keys %tests) {
    printf STDERR "%s [%s] ", $dest, $test;
    eval {$tests{$test}->()}; warn('skipped, ', $@), next if $@;
    my($tps) = 0;
    for (1..$testnum) {
      my $r = Benchmark::countit($testtime => $tests{$test});
      my($pu, $ps, $n) = @{$r}[1,2,5];
      $tps += $n / ($pu + $ps);
      print STDERR ".";
    }
    printf STDERR " %.5s call/s\n", $result{$dest}{$test} = $tps / $testnum;
  }
}