mkwan       2003/06/25 10:08:32

  Modified:    java/src/org/apache/xalan/xsltc/compiler Constants.java
                        VariableBase.java
  Added:       java/src/org/apache/xalan/xsltc/dom
                        CachedNodeListIterator.java
                        ClonedNodeListIterator.java
  Log:
  Performance improvement for XSLTC
  
  Introduce two new iterators (CachedNodeListIterator and 
CloneNodeListIterator).
  They are used by variable/param references that are evaluated to nodesets.
  CachedNodeListIterator traverses the underlying iterator once and caches the
  nodes in an IntegerArray. Its clone() method returns an object of
  CloneNodeListIterator, which also retrieves nodes from the cache.
  
  This mostly improves the case where a variable is referenced multiple times
  in a context. In the old code, the iterator for the variable is traversed
  as many times as the variable is referenced. Using the cached iterators,
  the iterator is only traversed once. All later references retrieve nodes
  from the cache.
  
  Revision  Changes    Path
  1.34      +3 -1      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Constants.java
  
  Index: Constants.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Constants.java,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- Constants.java    1 Apr 2003 21:08:59 -0000       1.33
  +++ Constants.java    25 Jun 2003 17:08:31 -0000      1.34
  @@ -189,6 +189,8 @@
        = "org.apache.xalan.xsltc.dom.UnionIterator";
       public static final String STEP_ITERATOR_CLASS
        = "org.apache.xalan.xsltc.dom.StepIterator";
  +    public static final String CACHED_NODE_LIST_ITERATOR_CLASS
  +     = "org.apache.xalan.xsltc.dom.CachedNodeListIterator";  
       public static final String NTH_ITERATOR_CLASS
        = "org.apache.xalan.xsltc.dom.NthIterator";
       public static final String ABSOLUTE_ITERATOR
  
  
  
  1.19      +21 -1     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/VariableBase.java
  
  Index: VariableBase.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/VariableBase.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- VariableBase.java 30 Jan 2003 18:46:02 -0000      1.18
  +++ VariableBase.java 25 Jun 2003 17:08:31 -0000      1.19
  @@ -71,11 +71,14 @@
   import org.apache.bcel.generic.ConstantPoolGen;
   import org.apache.bcel.generic.Instruction;
   import org.apache.bcel.generic.InstructionList;
  +import org.apache.bcel.generic.INVOKESPECIAL;
   import org.apache.bcel.generic.LocalVariableGen;
  +import org.apache.bcel.generic.NEW;
   import org.apache.bcel.generic.PUSH;
   import org.apache.xalan.xsltc.compiler.util.ClassGenerator;
   import org.apache.xalan.xsltc.compiler.util.ErrorMsg;
   import org.apache.xalan.xsltc.compiler.util.MethodGenerator;
  +import org.apache.xalan.xsltc.compiler.util.NodeSetType;
   import org.apache.xalan.xsltc.compiler.util.Type;
   import org.apache.xalan.xsltc.compiler.util.Util;
   
  @@ -286,6 +289,23 @@
        // Compile expression is 'select' attribute if present
        if (_select != null) {
            _select.translate(classGen, methodGen);
  +         // Create a CachedNodeListIterator for select expressions
  +         // in a variable or parameter.
  +         if (_select.getType() instanceof NodeSetType) {
  +             final ConstantPoolGen cpg = classGen.getConstantPool();
  +             final InstructionList il = methodGen.getInstructionList();
  +             
  +             final int initCNI = 
cpg.addMethodref(CACHED_NODE_LIST_ITERATOR_CLASS,
  +                                         "<init>",
  +                                         "("
  +                                         +NODE_ITERATOR_SIG
  +                                         +")V");
  +             il.append(new 
NEW(cpg.addClass(CACHED_NODE_LIST_ITERATOR_CLASS)));
  +             il.append(DUP_X1);
  +             il.append(SWAP);
  +
  +             il.append(new INVOKESPECIAL(initCNI));
  +         }
            _select.startResetIterator(classGen, methodGen);
        }
        // If not, compile result tree from parameter body if present.
  
  
  
  1.1                  
xml-xalan/java/src/org/apache/xalan/xsltc/dom/CachedNodeListIterator.java
  
  Index: CachedNodeListIterator.java
  ===================================================================
  /*
   * @(#)$Id: CachedNodeListIterator.java,v 1.1 2003/06/25 17:08:32 mkwan Exp $
   *
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 2001, Sun
   * Microsystems., http://www.sun.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package org.apache.xalan.xsltc.dom;
  
  import org.apache.xml.dtm.DTMAxisIterator;
  import org.apache.xml.dtm.ref.DTMAxisIteratorBase;
  import org.apache.xalan.xsltc.util.IntegerArray;
  
  /**
   * CachedNodeListIterator is used for select expressions in a 
   * variable or parameter. This iterator caches all nodes in an 
   * IntegerArray. Its cloneIterator() method is overridden to 
   * return an object of ClonedNodeListIterator.
   */
  public final class CachedNodeListIterator extends DTMAxisIteratorBase {
  
      /**
       * Source for this iterator.
       */
      private DTMAxisIterator _source;
      private IntegerArray _nodes = new IntegerArray();
      private int _numCachedNodes = 0;
      private int _index = 0;
      private boolean _isEnded = false;
  
      public CachedNodeListIterator(DTMAxisIterator source) {
        _source = source;
      }
  
      public void setRestartable(boolean isRestartable) {
        //_isRestartable = isRestartable;
        //_source.setRestartable(isRestartable);
      }
  
      public DTMAxisIterator setStartNode(int node) {
        if (_isRestartable) {
            _startNode = node;
            _source.setStartNode(node);
            resetPosition();
            
            _isRestartable = false;
        }
        return this;
      }
  
      public int next() {
          return getNode(_index++);
      }
      
      public int getPosition() {
        return _index == 0 ? 1 : _index;
      }
      
      public int getNodeByPosition(int pos) {
        return getNode(pos);
      }
          
      public int getNode(int index) {
          if (index < _numCachedNodes) {
              return _nodes.at(index);
          }
          else if (!_isEnded){
              int node = _source.next();
              if (node != END) {
                _nodes.add(node);
                _numCachedNodes++;
              }
              else {
                _isEnded = true;
              }
              return node;
          }
          else
              return END;
      }
  
      public DTMAxisIterator cloneIterator() {
        ClonedNodeListIterator clone = new ClonedNodeListIterator(this);
        return clone;
      }
  
      public DTMAxisIterator reset() {
        _index = 0;
        return this;
      }
      
      public void setMark() {
        _source.setMark();
      }
  
      public void gotoMark() {
        _source.gotoMark();
      }
  }
  
  
  
  1.1                  
xml-xalan/java/src/org/apache/xalan/xsltc/dom/ClonedNodeListIterator.java
  
  Index: ClonedNodeListIterator.java
  ===================================================================
  /*
   * @(#)$Id: ClonedNodeListIterator.java,v 1.1 2003/06/25 17:08:32 mkwan Exp $
   *
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 2001, Sun
   * Microsystems., http://www.sun.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package org.apache.xalan.xsltc.dom;
  
  import org.apache.xml.dtm.DTMAxisIterator;
  import org.apache.xml.dtm.ref.DTMAxisIteratorBase;
  
  /**
   * A ClonedNodeListIterator is returned by the cloneIterator() method
   * of a CachedNodeListIterator. Its next() method retrieves the nodes from
   * the cache of the CachedNodeListIterator.
   */
  public final class ClonedNodeListIterator extends DTMAxisIteratorBase {
  
      /**
       * Source for this iterator.
       */
      private CachedNodeListIterator _source;
      private int _index = 0;
  
      public ClonedNodeListIterator(CachedNodeListIterator source) {
        _source = source;
      }
  
      public void setRestartable(boolean isRestartable) {
        //_isRestartable = isRestartable;
        //_source.setRestartable(isRestartable);
      }
  
      public DTMAxisIterator setStartNode(int node) {
        return this;
      }
  
      public int next() {
          return _source.getNode(_index++);
      }
      
      public int getPosition() {
        return _index == 0 ? 1 : _index;
      }
  
      public int getNodeByPosition(int pos) {
        return _source.getNode(pos);
      }
      
      public DTMAxisIterator cloneIterator() {
        return _source.cloneIterator();
      }
  
      public DTMAxisIterator reset() {
        _index = 0;
        return this;
      }
      
      public void setMark() {
        _source.setMark();
      }
  
      public void gotoMark() {
        _source.gotoMark();
      }
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to