Re: stress testing Xerces

[email protected] (Jason E. Stewart)
Newsgroups gmane.text.xml.xerces-p.devel
Message-ID <[email protected]>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
memtest.pl (application/x-perl, 3.6 KB)
# use blib;
use XML::Xerces;
use strict;
use Getopt::Long;
use Linux::MemInfo;

my %OPTIONS;
$OPTIONS{count} = 1000;
$OPTIONS{dom} = 1;
my $rc = GetOptions(\%OPTIONS,
		    'file=s',
		    'count=i',
		    'help',
		    'validate',
		    'dom',
		    'sax2',
		    'schema',
		    );
my $USAGE = <<"EOU";
usage: $0 [required flags]
  required flags:
    --file=file_name  : the XML file to parse

  optional parameters:
    --dom             : use a DOM parser (default)
    --sax2            : use a SAX2XMLReader
    --schema          : parse a W3C XML Schema file
    --count=num       : run num iterations default = $OPTIONS{count}
    --validate        : turn validation on
    --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};

# remove the default if told to use SAX2
delete $OPTIONS{dom}
  if exists $OPTIONS{sax2};

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>;
}

# get the initial results:
my %info = get_mem_info();
my $starting_mem = $info{mem_free};
my $errorHandler = XML::Xerces::PerlErrorHandler->new() ;

my $validate = 0;
my $schema = 0;
my $namespace = 0;
if (exists $OPTIONS{validate}) {
  $validate = 1;
  if (exists $OPTIONS{schema}) {
    $schema = 1;
    $namespace = 1;
  }
}

my $count = 0;
for (1..$OPTIONS{count}) {
  $count++;
  # run the loop
  if (exists $OPTIONS{dom}) {
    validate_dom($xml);
  } elsif (exists $OPTIONS{sax2}) {
    validate_sax2($xml);
  }
  if ($count % 100 == 0) {
    my %info = get_mem_info();
    printf LOG "%d: mem leaked: %d, leak/iteration:%f\n",
      $count,
      $starting_mem - $info{mem_free},
      ($starting_mem - $info{mem_free})/$count,
	;
  }
}

sub validate_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("http://xml.org/sax/features/namespaces", $namespace) ;
    $parser->setFeature("http://apache.org/xml/features/validation/schema", $schema) ;
    $parser->setFeature("http://apache.org/xml/features/validation/schema-full-checking", $schema) ;
    $parser->setFeature("http://apache.org/xml/features/validation-error-as-fatal", $validate) ;
  };
  XML::Xerces::error($@) if $@;


  eval {
    $parser->setFeature("http://xml.org/sax/features/validation", $validate) ;
    $parser->setFeature("http://apache.org/xml/features/validation/dynamic", 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 validate_dom {
  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::XercesDOMParser->new() ;
  $parser->setErrorHandler($errorHandler) ;

  $parser->setValidationScheme ($validate);
  $parser->setDoNamespaces ($namespace);
  $parser->setDoSchema ($schema);
  $parser->setValidationSchemaFullChecking ($schema);

  eval {
    my $is = XML::Xerces::MemBufInputSource->new($xml);
    # my $is = XML::Xerces::LocalFileInputSource->new($OPTIONS{file});
    $parser->parse($is) ;
  } ;
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.