You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ja...@apache.org on 2004/05/20 18:43:20 UTC

svn commit: rev 20164 - in xml/xerces-p/trunk: . docs

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: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org