Author: jasons Date: Thu May 20 09:43:19 2004 New Revision: 20164 Added: xml/xerces-p/trunk/docs/memtest.txt xml/xerces-p/trunk/memtest.pl Log: new
Added: xml/xerces-p/trunk/docs/memtest.txt ============================================================================== --- (empty file) +++ xml/xerces-p/trunk/docs/memtest.txt Thu May 20 09:43:19 2004 @@ -0,0 +1,131 @@ +==== DOM Parser ===== + +~/work/xml-xerces/perl $ perl ./memtest.pl --file samples/personal.xml --test=dom +starting mem: 18544k +100: total mem: 18572k, leaked mem: 28k, leak/iteration:286b +200: total mem: 18588k, leaked mem: 44k, leak/iteration:225b +300: total mem: 18612k, leaked mem: 68k, leak/iteration:232b +400: total mem: 18624k, leaked mem: 80k, leak/iteration:204b +500: total mem: 18640k, leaked mem: 96k, leak/iteration:196b +600: total mem: 18656k, leaked mem: 112k, leak/iteration:191b +700: total mem: 18672k, leaked mem: 128k, leak/iteration:187b +800: total mem: 18688k, leaked mem: 144k, leak/iteration:184b +900: total mem: 18708k, leaked mem: 164k, leak/iteration:186b +1000: total mem: 18720k, leaked mem: 176k, leak/iteration:180b +~/work/xml-xerces/perl $ perl ./memtest.pl --file samples/personal.xml --test=dom --validate +starting mem: 18544k +100: total mem: 18576k, leaked mem: 32k, leak/iteration:327b +200: total mem: 18596k, leaked mem: 52k, leak/iteration:266b +300: total mem: 18616k, leaked mem: 72k, leak/iteration:245b +400: total mem: 18636k, leaked mem: 92k, leak/iteration:235b +500: total mem: 18652k, leaked mem: 108k, leak/iteration:221b +600: total mem: 18668k, leaked mem: 124k, leak/iteration:211b +700: total mem: 18684k, leaked mem: 140k, leak/iteration:204b +800: total mem: 18700k, leaked mem: 156k, leak/iteration:199b +900: total mem: 18716k, leaked mem: 172k, leak/iteration:195b +1000: total mem: 18732k, leaked mem: 188k, leak/iteration:192b +~/work/xml-xerces/perl $ perl ./memtest.pl --file samples/personal-schema.xml --test=dom --validate --schema +starting mem: 18552k +100: total mem: 18636k, leaked mem: 84k, leak/iteration:860b +200: total mem: 18636k, leaked mem: 84k, leak/iteration:430b +300: total mem: 18820k, leaked mem: 268k, leak/iteration:914b +400: total mem: 18836k, leaked mem: 284k, leak/iteration:727b +500: total mem: 18852k, leaked mem: 300k, leak/iteration:614b +600: total mem: 18872k, leaked mem: 320k, leak/iteration:546b +700: total mem: 18888k, leaked mem: 336k, leak/iteration:491b +800: total mem: 18904k, leaked mem: 352k, leak/iteration:450b +900: total mem: 18904k, leaked mem: 352k, leak/iteration:400b +1000: total mem: 18904k, leaked mem: 352k, leak/iteration:360b + +==== DOM Builder ===== + +~/work/xml-xerces/perl $ perl ./memtest.pl --file samples/personal.xml --test=builder +starting mem: 18548k +100: total mem: 18568k, leaked mem: 20k, leak/iteration:204b +200: total mem: 18568k, leaked mem: 20k, leak/iteration:102b +300: total mem: 18568k, leaked mem: 20k, leak/iteration:68b +400: total mem: 18568k, leaked mem: 20k, leak/iteration:51b +500: total mem: 18568k, leaked mem: 20k, leak/iteration:40b +600: total mem: 18568k, leaked mem: 20k, leak/iteration:34b +700: total mem: 18568k, leaked mem: 20k, leak/iteration:29b +800: total mem: 18568k, leaked mem: 20k, leak/iteration:25b +900: total mem: 18576k, leaked mem: 28k, leak/iteration:31b +1000: total mem: 18576k, leaked mem: 28k, leak/iteration:28b +~/work/xml-xerces/perl $ perl ./memtest.pl --file samples/personal.xml --test=builder --validate +starting mem: 18548k +100: total mem: 18564k, leaked mem: 16k, leak/iteration:163b +200: total mem: 18564k, leaked mem: 16k, leak/iteration:81b +300: total mem: 18572k, leaked mem: 24k, leak/iteration:81b +400: total mem: 18572k, leaked mem: 24k, leak/iteration:61b +500: total mem: 18572k, leaked mem: 24k, leak/iteration:49b +600: total mem: 18572k, leaked mem: 24k, leak/iteration:40b +700: total mem: 18572k, leaked mem: 24k, leak/iteration:35b +800: total mem: 18572k, leaked mem: 24k, leak/iteration:30b +900: total mem: 18572k, leaked mem: 24k, leak/iteration:27b +1000: total mem: 18572k, leaked mem: 24k, leak/iteration:24b +~/work/xml-xerces/perl $ perl ./memtest.pl --file samples/personal-schema.xml --test=builder --validate --schema +starting mem: 18576k +100: total mem: 18656k, leaked mem: 80k, leak/iteration:819b +200: total mem: 18656k, leaked mem: 80k, leak/iteration:409b +300: total mem: 18656k, leaked mem: 80k, leak/iteration:273b +400: total mem: 18656k, leaked mem: 80k, leak/iteration:204b +500: total mem: 18656k, leaked mem: 80k, leak/iteration:163b +600: total mem: 18656k, leaked mem: 80k, leak/iteration:136b +700: total mem: 18656k, leaked mem: 80k, leak/iteration:117b +800: total mem: 18656k, leaked mem: 80k, leak/iteration:102b +900: total mem: 18656k, leaked mem: 80k, leak/iteration:91b +1000: total mem: 18656k, leaked mem: 80k, leak/iteration:81b + +==== Exception Handling ===== + +~/work/xml-xerces/perl $ perl ./memtest.pl --file samples/personal-schema.xml --test=exception --validate +starting mem: 18616k +100: total mem: 28744k, leaked mem: 10128k, leak/iteration:101k +200: total mem: 38844k, leaked mem: 20228k, leak/iteration:101k +300: total mem: 48968k, leaked mem: 30352k, leak/iteration:101k +400: total mem: 59072k, leaked mem: 40456k, leak/iteration:101k +500: total mem: 69180k, leaked mem: 50564k, leak/iteration:101k +600: total mem: 79316k, leaked mem: 60700k, leak/iteration:101k +700: total mem: 89428k, leaked mem: 70812k, leak/iteration:101k +800: total mem: 99516k, leaked mem: 80900k, leak/iteration:101k +900: total mem: 109640k, leaked mem: 91024k, leak/iteration:101k +1000: total mem: 119740k, leaked mem: 101124k, leak/iteration:101k + +==== SAX2 ===== + +~/work/xml-xerces/perl $ perl ./memtest.pl --file samples/personal.xml --test=sax2 +starting mem: 18496k +100: total mem: 23060k, leaked mem: 4564k, leak/iteration:45k +200: total mem: 27688k, leaked mem: 9192k, leak/iteration:45k +300: total mem: 32408k, leaked mem: 13912k, leak/iteration:46k +400: total mem: 36852k, leaked mem: 18356k, leak/iteration:45k +500: total mem: 41564k, leaked mem: 23068k, leak/iteration:46k +600: total mem: 46112k, leaked mem: 27616k, leak/iteration:46k +700: total mem: 50644k, leaked mem: 32148k, leak/iteration:45k +800: total mem: 55312k, leaked mem: 36816k, leak/iteration:46k +900: total mem: 59756k, leaked mem: 41260k, leak/iteration:45k +1000: total mem: 64464k, leaked mem: 45968k, leak/iteration:45k +~/work/xml-xerces/perl $ perl ./memtest.pl --file samples/personal.xml --test=sax2 --validate +starting mem: 18504k +100: total mem: 23504k, leaked mem: 5000k, leak/iteration:50k +200: total mem: 28396k, leaked mem: 9892k, leak/iteration:49k +300: total mem: 33292k, leaked mem: 14788k, leak/iteration:49k +400: total mem: 38180k, leaked mem: 19676k, leak/iteration:49k +500: total mem: 43068k, leaked mem: 24564k, leak/iteration:49k +600: total mem: 47976k, leaked mem: 29472k, leak/iteration:49k +700: total mem: 52860k, leaked mem: 34356k, leak/iteration:49k +800: total mem: 57748k, leaked mem: 39244k, leak/iteration:49k +900: total mem: 62640k, leaked mem: 44136k, leak/iteration:49k +1000: total mem: 67528k, leaked mem: 49024k, leak/iteration:49k +~/work/xml-xerces/perl $ perl ./memtest.pl --file samples/personal-schema.xml --test=sax2 --validate --schema +starting mem: 18512k +100: total mem: 24844k, leaked mem: 6332k, leak/iteration:63k +200: total mem: 30876k, leaked mem: 12364k, leak/iteration:61k +300: total mem: 36932k, leaked mem: 18420k, leak/iteration:61k +400: total mem: 43016k, leaked mem: 24504k, leak/iteration:61k +500: total mem: 49104k, leaked mem: 30592k, leak/iteration:61k +600: total mem: 55208k, leaked mem: 36696k, leak/iteration:61k +700: total mem: 61292k, leaked mem: 42780k, leak/iteration:61k +800: total mem: 67380k, leaked mem: 48868k, leak/iteration:61k +900: total mem: 73468k, leaked mem: 54956k, leak/iteration:61k +1000: total mem: 79556k, leaked mem: 61044k, leak/iteration:61k Added: xml/xerces-p/trunk/memtest.pl ============================================================================== --- (empty file) +++ xml/xerces-p/trunk/memtest.pl Thu May 20 09:43:19 2004 @@ -0,0 +1,262 @@ +use blib; +use XML::Xerces; +use strict; +use Getopt::Long; +use Linux::MemInfo; +use Proc::ProcessTable; +use IO::Handle; + +my %OPTIONS; +$OPTIONS{count} = 1000; +$OPTIONS{test} = 'dom'; +my $rc = GetOptions(\%OPTIONS, + 'file=s', + 'count=i', + 'test=s', + 'help', + 'validate', + 'schema', + ); +my $USAGE = <<"EOU"; +usage: $0 [required flags] [optional flags] + required flags: + --file=file_name : the XML file to parse + --test=name : which test to run + + test names: + dom : use a DOM parser (default) + builder : use a DOMBuilder + writer : test a DOMWriter + sax2 : use a SAX2XMLReader + exception : use a DOM parser to test exception handler leakage + + optional parameters: + --count=num : run num iterations default = $OPTIONS{count} + --validate : turn validation on + --schema : parse a W3C XML Schema file (forces --validate) + --help : print this message +EOU + +die "$rc\n$USAGE" unless $rc; +die $USAGE if exists $OPTIONS{help}; + +die "Must specify --file\n$USAGE" + unless exists $OPTIONS{file}; + +my @tests = qw(dom sax2 builder writer exception); +unless (grep {$OPTIONS{test} eq $_} @tests) { + die "Invalid test: $OPTIONS{test}, use one of: " . join(',', @tests) . "\n"; +} + +open(IN,$OPTIONS{file}) + or die "Couldn't open $OPTIONS{file} for reading"; +my $logfile = '/tmp/xerces-memtest.log'; +open(LOG,">$logfile") + or die "Couldn't open $logfile for reading"; + +# slurp in the file +my $xml; +{ + local $/; + $xml = <IN>; +} + +# we initialize the starting memory after running the first iteration +my $starting_size; + +my $validate = 0; +my $schema = 0; +my $namespace = 0; +if (exists $OPTIONS{validate}) { + if ($OPTIONS{test} eq 'dom') { + $validate = $XML::Xerces::AbstractDOMParser::Val_Always; + } else { + $validate = 1; + } +} +if (exists $OPTIONS{schema}) { + $validate = 1; + $schema = 1; + $namespace = 1; +} + +STDERR->autoflush(); + +my $errorHandler = XML::Xerces::PerlErrorHandler->new() ; +my $impl = XML::Xerces::DOMImplementationRegistry::getDOMImplementation('LS'); +# Just to make sure there is only one, $Parser is global but it's not used anywhere else: +my $dom = XML::Xerces::XercesDOMParser->new() ; +$dom->setErrorHandler($errorHandler) ; +$dom->setValidationScheme ($validate); +$dom->setDoNamespaces ($namespace); +$dom->setDoSchema ($schema); +$dom->setValidationSchemaFullChecking ($schema); +$dom->setValidationConstraintFatal ($validate); + +my $builder = $impl->createDOMBuilder($XML::Xerces::DOMImplementationLS::MODE_SYNCHRONOUS,''); +my $writer = $impl->createDOMWriter(); +my $doc; +if (exists $OPTIONS{writer}) { + if ($writer->canSetFeature('format-pretty-print',1)) { + $writer->setFeature('format-pretty-print',1); + } + $doc = $builder->parseURI($OPTIONS{file}); +} + +for (my $count=1;$count<=$OPTIONS{count};$count++) { + # run the loop + if ($OPTIONS{test} eq 'dom') { + test_dom($xml,$dom); + } elsif ($OPTIONS{test} eq 'exception') { + test_exception($xml,$dom); + } elsif ($OPTIONS{test} eq 'sax2') { + test_sax2($xml); + } elsif ($OPTIONS{test} eq 'builder') { + test_builder($xml,$impl); + } elsif ($OPTIONS{test} eq 'writer') { + test_writer($writer,$doc); + } + if ($count % 100 == 0) { + my ($proc) = get_proc($$); + my $size = $proc->size(); + my $leak = $size - $starting_size; + my $iter_leak = $leak/$count; + my ($size_unit,$leak_unit,$iter_unit); + ($size,$size_unit) = get_val_unit($size); + ($leak,$leak_unit) = get_val_unit($leak); + ($iter_leak,$iter_unit) = get_val_unit($iter_leak); + printf STDERR "%d: total mem: %d%s, leaked mem: %d%s, leak/iteration:%d%s\n", + $count, + $size, + $size_unit, + $leak, + $leak_unit, + $iter_leak, + $iter_unit, + ; + } elsif ($count == 1) { + my ($proc) = get_proc($$); + $starting_size = $proc->size(); + printf STDERR "starting mem: %dk\n", int($starting_size/1024); + } +} + +sub get_proc { + my $pid = shift; + return grep {$_->pid == $pid} @{Proc::ProcessTable->new->table}; +} + +sub test_sax2 { + my $xml = shift ; + # Just to make sure there is only one, $Parser is global but it's not used anywhere else: + my $parser = XML::Xerces::XMLReaderFactory::createXMLReader() ; + $parser->setErrorHandler($errorHandler) ; + +# my $contentHandler = new XML::Xerces::PerlContentHandler() ; +# $parser->setContentHandler($contentHandler) ; + + eval { + $parser->setFeature("$XML::Xerces::XMLUni::fgSAX2CoreNameSpaces", $namespace); + $parser->setFeature("$XML::Xerces::XMLUni::fgXercesSchema", $schema); + $parser->setFeature("$XML::Xerces::XMLUni::fgXercesSchemaFullChecking", $schema); + $parser->setFeature("$XML::Xerces::XMLUni::fgXercesValidationErrorAsFatal", $validate); + }; + XML::Xerces::error($@) if $@; + + + eval { + $parser->setFeature("$XML::Xerces::XMLUni::fgSAX2CoreValidation", $validate); + $parser->setFeature("$XML::Xerces::XMLUni::fgXercesDynamic", 0); + }; + XML::Xerces::error($@) if $@; + + eval { + # my $is = XML::Xerces::MemBufInputSource->new($xml); + my $is = XML::Xerces::LocalFileInputSource->new($OPTIONS{file}); + $parser->parse($is) ; + } ; + XML::Xerces::error($@) if $@; +} + +sub test_builder { + my $xml = shift ; + my $impl = shift; + + my $parser = $impl->createDOMBuilder($XML::Xerces::DOMImplementationLS::MODE_SYNCHRONOUS,''); + + eval { + $parser->setFeature("$XML::Xerces::XMLUni::fgDOMNamespaces", $namespace) ; + $parser->setFeature("$XML::Xerces::XMLUni::fgXercesSchema", $schema) ; + $parser->setFeature("$XML::Xerces::XMLUni::fgXercesSchemaFullChecking", $schema) ; + }; + XML::Xerces::error($@) if $@; + + + eval { + $parser->setFeature("$XML::Xerces::XMLUni::fgDOMValidation", $validate) ; + $parser->setFeature("$XML::Xerces::XMLUni::fgXercesValidationErrorAsFatal", $validate) ; + $parser->setFeature("$XML::Xerces::XMLUni::fgXercesContinueAfterFatalError", not $validate) ; +# $parser->setFeature("$XML::Xerces::XMLUni::fgDOMValidateIfSchema", 1) ; + }; + XML::Xerces::error($@) if $@; + + eval { + # my $is = XML::Xerces::MemBufInputSource->new($xml); + # my $is = XML::Xerces::LocalFileInputSource->new($OPTIONS{file}); + $parser->parseURI($OPTIONS{file}) ; + } ; + XML::Xerces::error($@) if $@; + $parser->resetDocumentPool(); + $parser->release(); +} + +sub test_dom { + my $xml = shift ; + my $parser = shift; + + eval { + # my $is = XML::Xerces::MemBufInputSource->new($xml); + my $is = XML::Xerces::LocalFileInputSource->new($OPTIONS{file}); + $parser->parse($is) ; + }; + XML::Xerces::error($@) if $@; + $parser->resetDocumentPool(); +} + +sub test_exception { + my $xml = shift ; + my $parser = shift; + + eval { + # my $is = XML::Xerces::MemBufInputSource->new($xml); + my $is = XML::Xerces::LocalFileInputSource->new($OPTIONS{file}); + $parser->parse($is) ; + }; + # if we run this test with a file that raises an exception + # and we leave this line commented out, we will check if exceptions + # are leaking or not + # XML::Xerces::error($@) if $@; + $parser->resetDocumentPool(); +} + +sub test_writer { + my $writer = shift; + my $doc = shift; + + my $target = XML::Xerces::MemBufFormatTarget->new(); + $writer->writeNode($target, $doc); + + my $xml = $target->getRawBuffer(); +} + +sub get_val_unit { + my $val = shift; + my $unit; + if ($val > 2 * 1024) { + $unit = 'k'; + $val = int($val/1024); + } else { + $unit = 'b'; + } + return ($val,$unit) +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]