Hi guys, Poor userdata performance was due to RefHashTableOf not expanding the size of the table as the number of nodes with userdata increased, leading to linear-time lookup performance. Here's the bug in question: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=15503.
The patch to fix this was committed back in may. I can't remember when 2.3.0 was released, but I think it was after the patch went in. -Nathan -----Original Message----- From: Gareth Reakes [mailto:[EMAIL PROTECTED] Sent: Thursday, September 04, 2003 7:58 AM To: [EMAIL PROTECTED] Subject: RE: DOMBuilder is terribly slow: need quick reply Hi, I can't find anything in the archives, but something to do with caching rung a bell in my mind. If you take a look in DOMDocumentImpl, you will see that we assign a 29 place table. After this is used up it doubles in size. I suggest you start the table very big and or adjust the algorithm that rehashes in RefHashTableOf. Gareth On Thu, 4 Sep 2003, Agrawal, Vikas (ELS) wrote: > Thanks Gareth for your reply. I am using xml4c 2.2.0. You are right that it > is just because of user data. Once I comment that line and code becomes > fast. But I do need to set UserData. Could you suggest me what is the > proposed solution to this. > Thanks & Regards > Vikas Agrawal > > -----Original Message----- > From: Gareth Reakes [mailto:[EMAIL PROTECTED] > Sent: 04 September 2003 15:16 > To: [EMAIL PROTECTED] > Subject: Re: DOMBuilder is terribly slow: need quick reply > > > Hi, > I recall some discussion a while back about having lots of > userdata being very slow. Take out that line and reparse and if that is > the case then I will wrack my brain (or we could always look in the > archives). I recall a proposed solution to this as well. What version are > you using? > > Gareth > > > > On Thu, 4 Sep 2003, Agrawal, Vikas (ELS) wrote: > > > Hi All, > > > > I am using DOMBuilder as a parser to parse my 10 MB file and it is > terribly > > horribly slow. Could anybody suggest me how to improve perfomance. James > > clark SP parser was used to take not more than a 30 seconds to parse this > > file. DOMBuilder is taking around 20 minutes to parse my file if I > override > > the startElement function as follows. > > > > Normally DOMBuilder is also efficient and taking just 30 seconds if I do > not > > override the startElement function. I am wondering why is it adding > another > > 19 and half minutes in parsing time if I just override the startElement > and > > that is just to put node location information in the node user data. > > > > Am I doing something wrong in the overridden startElement function below. > > > > class EsDOMBuilderImpl : public DOMBuilderImpl > > > > void EsDOMBuilderImpl::startElement > > ( > > const XMLElementDecl& elemDecl > > , const unsigned int urlId > > , const XMLCh* const elemPrefix > > , const RefVectorOf<XMLAttr>& attrList > > , const unsigned int attrCount > > , const bool isEmpty > > , const bool isRoot > > ) > > { > > const XMLCh* const systemId = 0; > > > > > AbstractDOMParser::startElement(elemDecl,urlId,elemPrefix,attrList,attrCount > > ,isEmpty,isRoot); > > XMLScanner* sc = this->getScanner(); > > const Locator* loc = sc->getLocator(); > > > > int lineNum = loc->getLineNumber(); > > int colNum = loc->getColumnNumber(); > > int offset = sc->getSrcOffset(); > > DOMNode* node = this->getCurrentNode(); > > DOMLocator* location = new DOMLocatorImpl(lineNum, colNum, > > getCurrentNode(), systemId); > > location->setOffset(offset); > > > > node->setUserData(locXmlStr_,location,0); > > > > DOMLocator* vlocator = (DOMLocator*)node->getUserData(locXmlStr_); > > return; > > } > > > > In the following way I am creating the parser > > DOMBuilder* XmlDocumentTree::parserInstance() > > { > > if(parserInstance_ == NULL) > > { > > static const XMLCh gLS[] = { chLatin_L, chLatin_S, chNull }; > > > > > DOMImplementationRegistry::addSource((DOMImplementationSource*)EsDOMImplemen > > tationImpl::getDOMImplementationImpl()); > > DOMImplementation *impl = > > DOMImplementationRegistry::getDOMImplementation(gLS); > > > > parserInstance_ = > > > ((DOMImplementationLS*)impl)->createDOMBuilder(DOMImplementationLS::MODE_SYN > > CHRONOUS, 0); // it returns EsDOMBuilderImpl class pointer. > > delete impl; > > parserInstance_->setFeature(XMLUni::fgDOMValidation, true); > > parserInstance_->setFeature(XMLUni::fgDOMNamespaces, false); > > //parserInstance_->setFeature(X("namespaces"), true); > > > > > > parserInstance_->setFeature(XMLUni::fgDOMEntities, false); > > parserInstance_->setFeature(XMLUni::fgXercesCalculateSrcOfs, > > true); > > > > > ((EsDOMBuilderImpl*)parserInstance_)->setIncludeIgnorableWhitespace(false); > > } > > return parserInstance_; > > } > > > > I use it in the following way > > > > XMLPlatformUtils::Initialize(); > > app->init(); > > parser = parserInstance(); > > > > errHandler_ = new EsDOMErrorHandler(warn); > > parserInstance_->setErrorHandler(errHandler_); > > > > entHandler_ = new EsXml4cDomEntityResolver(); > > entHandler_->addDirToPath(env); > > parserInstance_->setEntityResolver(entHandler_); > > DOMDocument * doc = 0; > > doc = parser->parseURI(fname.c_str()); > > node = doc->getDocumentElement(); > > > > Thanks & Regards > > Vikas Agrawal > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > -- Gareth Reakes, Head of Product Development +44-1865-203192 DecisionSoft Limited http://www.decisionsoft.com XML Development and Services --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
