import SOAP-WSDL 2.00.01 from CPAN

git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00.01
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00.01.tar.gz
This commit is contained in:
Martin Kutter
2009-12-12 19:48:32 -08:00
committed by Michael G. Schwern
parent 0cbf981665
commit 745ce925c1
111 changed files with 1106 additions and 673 deletions
+67 -20
View File
@@ -1,15 +1,17 @@
#!/usr/bin/perl -w
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
use strict;
use warnings;
use lib '../lib';
use lib '../../Class-Std-Fast/lib';
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/lib';
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/arch';
use lib '../t/lib';
# use SOAP::WSDL::SAX::MessageHandler;
use Benchmark qw(cmpthese timethese);
use SOAP::WSDL::Expat::MessageParser;
use SOAP::WSDL::Expat::Message2Hash;
use SOAP::WSDL::Expat::MessageParser_XS;
use SOAP::Lite;
use XML::Simple;
use XML::LibXML;
@@ -17,24 +19,50 @@ use MyComplexType;
use MyElement;
use MySimpleType;
my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body>
<MyAtomicComplexTypeElement xmlns="urn:Test" >
<test>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test55</test2>
<test2 >Test2</test2>
<test2 >Test3</test2>
<test2 >Test4</test2>
<test2 >Test5</test2>
<test2 >Test6</test2>
<test2 >Test7</test2>
<test2 >Test8</test2>
<test2 >Test9</test2>
<test2 >Test10</test2>
<test2 >Test11</test2>
<test2 >Test12</test2>
<test2 >Test13</test2>
<test2 >Test55</test2>
<test2 >Test14</test2>
<test2 >Test15</test2>
<test2 >Test16</test2>
<test2 >Test17</test2>
<test2 >Test18</test2>
<test2 >Test19</test2>
<test2 >Test20</test2>
<test2 >Test21</test2>
<test2 >Test22</test2>
<test2 >Test23</test2>
<test2 >Test24</test2>
<test2 >Test25</test2>
<test2 >Test565</test2>
<test2 >Test27</test2>
<test2 >Test28</test2>
<test2 >Test29</test2>
<test2 >Test30</test2>
<test2 >Test31</test2>
<test2 >Test32</test2>
<test2 >Test33</test2>
<test2 >Test34</test2>
<test2 >Test35</test2>
<test2 >Test36</test2>
<test2 >Test37</test2>
<test2 >Test38</test2>
<test2 >Test55</test2>
</test>
</MyAtomicComplexTypeElement>
</SOAP-ENV:Body></SOAP-ENV:Envelope>};
@@ -57,13 +85,17 @@ my @data;
my $deserializer = SOAP::Deserializer->new();
sub libxml_test {
my $parser_xs = SOAP::WSDL::Expat::MessageParser_XS->new({
class_resolver => 'FakeResolver'
});
sub libxml_test {
my $dom = $libxml->parse_string( $xml );
push @data, dom2hash( $dom->firstChild );
};
sub dom2hash {
for ($_[0]->childNodes) {
for ($_[0]->childNodes) {
if (exists $_[1]->{ $_->nodeName }) {
if (ref $_[1]->{ $_->nodeName } eq 'ARRAY') {
if ($_->nodeName eq '#text') {
@@ -78,7 +110,7 @@ sub dom2hash {
$_[1] = [ $_[1], $_->textContent() ];
}
else {
$_[1]->{ $_->nodeName } = [ $_[1]->{ $_->nodeName } ,
$_[1]->{ $_->nodeName } = [ $_[1]->{ $_->nodeName } ,
dom2hash( $_, {} ) ];
}
}
@@ -94,11 +126,11 @@ sub dom2hash {
}
return $_[1];
}
cmpthese 5000,
cmpthese 5000,
{
'SOAP::WSDL (Hash)' => sub { push @data, $hash_parser->parse( $xml ) },
'SOAP::WSDL (XSD)' => sub { push @data, $parser->parse( $xml ) },
'SOAP::WSDL_XS (XSD)' => sub { push @data, $parser_xs->parse_string( $xml ) },
'XML::Simple (Hash)' => sub { push @data, XMLin $xml },
'XML::LibXML (DOM)' => sub { push @data, $libxml->parse_string( $xml ) },
'XML::LibXML (Hash)' => \&libxml_test,
@@ -128,3 +160,18 @@ BEGIN {
};
};
};
__END__
Output on my machine:
xml length: 641 bytes
Rate SOAP::Lite XML::Simple (Hash) SOAP::WSDL (XSD) XML::LibXML (Hash) SOAP::WSDL (Hash) SOAP::WSDL_XS (XSD) XML::LibXML (DOM)
SOAP::Lite 446/s -- -54% -72% -73% -80% -95% -96%
XML::Simple (Hash) 963/s 116% -- -39% -41% -57% -89% -91%
SOAP::WSDL (XSD) 1587/s 256% 65% -- -3% -29% -81% -86%
XML::LibXML (Hash) 1629/s 265% 69% 3% -- -27% -81% -85%
SOAP::WSDL (Hash) 2222/s 398% 131% 40% 36% -- -74% -80%
SOAP::WSDL_XS (XSD) 8475/s 1798% 780% 434% 420% 281% -- -24%
XML::LibXML (DOM) 11111/s 2389% 1053% 600% 582% 400% 31% --
+1 -1
View File
@@ -11,7 +11,7 @@ my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new();
timethese 10000, {
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new() },
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({
value => 'Teststring'
value => 'Teststring',
}) },
'set_FOO' => sub { $obj->set_value('Test') },
};
+5 -4
View File
@@ -11,8 +11,9 @@ my $obj = SOAP::WSDL::XSD::Typelib::Builtin::string->new();
timethese 20000, {
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new() },
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new({
value => 'Teststring'
}) },
value => 'Teststring',
})
},
};
$obj->set_value('Foobar');
@@ -36,7 +37,7 @@ new + params: 1 wallclock secs ( 0.53 usr + 0.01 sys = 0.54 CPU) @ 37037.04/s
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
get_FOO: 2 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 694444.44/s (n=1000000)
set_FOO: 0 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 694444.44/s (n=1000000)
::Fast
---
@@ -47,7 +48,7 @@ Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
get_FOO: 0 wallclock secs ( 0.81 usr + 0.00 sys = 0.81 CPU) @ 1234567.90/s (n=1000000)
set_FOO: 2 wallclock secs ( 0.87 usr + 0.01 sys = 0.88 CPU) @ 1136363.64/s (n=1000000)
::Fast with inlined ID
::Fast with inlined ID
Benchmark: timing 20000 iterations of new, new + params...
new: 0 wallclock secs ( 0.41 usr + 0.00 sys = 0.41 CPU) @ 48780.49/s (n=20000)
new + params: 1 wallclock secs ( 0.52 usr + 0.00 sys = 0.52 CPU) @ 38461.54/s (n=20000)
+34 -11
View File
@@ -1,29 +1,43 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use diagnostics;
use lib '../example/lib';
use lib '/home/martin/workspace/SOAP-WSDL-Fast_XS/blib/lib';
use lib '/home/martin/workspace/SOAP-WSDL-Fast_XS/blib/arch';
use lib '../../SOAP-Lite-0.71/lib';
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/lib';
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/arch';
use Data::Dumper;
use SOAP::Lite;
use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP;
use MyInterfaces::HelloWorld::HelloWorldSoap;
use SOAP::WSDL::Deserializer::XSD_XS;
use Benchmark qw(cmpthese);
use Benchmark qw(cmpthese timethese);
use SOAP::WSDL::Transport::HTTP;
use SOAP::WSDL::Factory::Transport;
SOAP::WSDL::Factory::Transport->register('http', 'SOAP::WSDL::Transport::HTTP');
#my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld.pl';
my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld';
my $lite = SOAP::Lite->new(
proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl'
proxy => $proxy
);
$lite->on_action( sub { "urn:HelloWorld#sayHello" });
$lite->autotype(0);
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new({
proxy => $proxy,
});
my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new();
my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new({
proxy => $proxy,
});
$soap_xs->set_deserializer( SOAP::WSDL::Deserializer::XSD_XS->new() );
my @result;
my @result = ();;
sub wsdl_bench {
push @result, $soap->sayHello({
@@ -40,7 +54,12 @@ sub wsdl_xs_bench {
}
my $wsdl = XML::Compile::WSDL11->new('../example/wsdl/11_helloworld.wsdl');
my $call = $wsdl->compileClient('sayHello');
my $call = $wsdl->compileClient('sayHello',
sloppy_integers => 1,
check_values => 0,
check_values => 0,
validation => 0,
);
sub compile_bench {
push @result, $call->(
@@ -58,12 +77,16 @@ sub lite_bench {
);
}
# give all a chance to perform first-run initializations
compile_bench();
lite_bench();
wsdl_bench();
wsdl_xs_bench();
cmpthese 150, {
timethese 150, {
'SOAP::WSDL' => \&wsdl_bench,
'SOAP::WSDL_XS' => \&wsdl_xs_bench,
'XML::Compile' => \&compile_bench,
# 'SOAP::Lite' => \&lite_bench,
}
'SOAP::Lite' => \&lite_bench,
};
+97 -19
View File
@@ -1,5 +1,7 @@
use lib '../lib';
use lib '../example/lib';
use lib '../../Class-Std-Fast/lib';
use lib '../../SOAP-Lite-0.71/lib';
use lib '../../SOAP-WSDL_XS/blib/lib';
use lib '../../SOAP-WSDL_XS/blib/arch';
use strict;
@@ -11,15 +13,80 @@ use XML::Compile::Util;
use XML::Compile::WSDL11;
use XML::Simple;
use SOAP::Lite;
use MyInterfaces::TestService::TestPort;
use SOAP::WSDL::Deserializer::XSD_XS;
use SOAP::WSDL::Factory::Deserializer;
#
# register SOAP::WSDL's transport as default for SOAP::WSDL and SOAP::WSDL_XS
# - they use SOAP::Lite's SOAP::Transport::* if available
#
use SOAP::WSDL::Transport::HTTP;
use SOAP::WSDL::Factory::Transport;
SOAP::WSDL::Factory::Transport->register('http', 'SOAP::WSDL::Transport::HTTP');
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
use SOAP::Lite;
use MyInterfaces::TestService::TestPort;
my $person = {
PersonID => { # MyTypes::PersonID
ID => 1, # int
},
Salutation => 'Salutation0', # string
Name => 'Name0', # string
GivenName => 'Martin', # string
DateOfBirth => '1970-01-01', # date
HomeAddress => { # MyTypes::Address
Street => 'Street 0', # string
ZIP => '00000', # string
City => 'City0', # string
Country => 'Country0', # string
PhoneNumber => '++499131123456', # PhoneNumber
MobilePhoneNumber => '++49150123456', # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => 'Somestreet 23', # string
ZIP => '12345', # string
City => 'SomeCity', # string
Country => 'Germany', # string
PhoneNumber => '++499131123456', # PhoneNumber
MobilePhoneNumber => '++49150123456', # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => [
{ # MyTypes::Contract
ContractID => 100000, # long
ContractName => 'SomeContract0', # string
},
{ # MyTypes::Contract
ContractID => 100001, # long
ContractName => 'SomeContract1', # string
},
{ # MyTypes::Contract
ContractID => 100002, # long
ContractName => 'SomeContract2', # string
},
{ # MyTypes::Contract
ContractID => 100003, # long
ContractName => 'SomeContract3', # string
},
],
},
}
;
#
# compile XML::Compile client with the options suggested by Mark Overmeer
# for maximum speedup
#
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl',
sloppy_integers => 1,
check_values => 0,
check_values => 0,
validation => 0,
ignore_facets => 1,
);
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl');
my $call = $compile->compileClient('ListPerson');
$call->({ in => undef});
@@ -52,34 +119,45 @@ Benchmark $n: Store result in private variable and destroy it
";
$n++;
cmpthese $count, {
# 'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
# 'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
# 'XML::Compile' => sub { my $result = $call->() },
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
'XML::Compile' => sub { my $result = $call->() },
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({}) },
# 'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )},
# 'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
};
print "\nBenchmark $n: Push result on list\n";
$n++;
cmpthese $count, {
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
# 'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
# 'XML::Compile' => sub { push @data, $call->() },
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'XML::Compile' => sub { push @data, $call->() },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
# 'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
};
@data = ();
print "\nBenchmark $n: Play it again, Sam\n";
$n++;
cmpthese $count, {
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
# 'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
# 'XML::Compile' => sub { push @data, $call->() },
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
# 'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
'XML::Compile' => sub { push @data, $call->() },
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
};
print "\nBenchmark $n: ca. 1kB request - result destroyed immediately\n";
$n++;
cmpthese $count, {
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({ in => $person }) },
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({ in => $person }) },
'XML::Compile' => sub { my $result = $call->({ in => $person }) },
};
print "\nBenchmark $n: ca. 1kB request - push result on list\n";
$n++;
cmpthese $count, {
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({ in => $person }) },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({ in => $person }) },
'XML::Compile' => sub { push @data, $call->({ in => $person }) },
};
+10 -1
View File
@@ -4,6 +4,7 @@ use lib '../../SOAP-WSDL_XS/blib/lib';
use lib '../../SOAP-WSDL_XS/blib/arch';
use strict;
use Benchmark;
use Storable;
#use SOAP::WSDL::Deserializer::XSD_XS;
use SOAP::WSDL::Factory::Deserializer;
# # register for SOAP 1.1
@@ -15,13 +16,21 @@ my @data = ();
my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too
timethis 100, sub { $soap->ListPerson({}) };
#timethis 100, sub { $soap->ListPerson({}) };
#timethis 50, sub { push @data, $soap->ListPerson({}) };
#@data = ();
# timethis 50, sub { push @data, $soap->ListPerson({}) };
# for (1..50) { push @data, $soap->ListPerson({}) };
#print $soap->ListPerson({});
my $result = $soap->ListPerson({});
timethis 30 , sub {
my $frozen = Storable::freeze( $result );
my $thawed = Storable::thaw($frozen);
};
# print $thawed;
package Transport;
use Class::Std::Fast;