Author: schor Date: Tue Feb 16 22:35:41 2016 New Revision: 1730763 URL: http://svn.apache.org/viewvc?rev=1730763&view=rev Log: [UIMA-4674] based on profiling, add non-checking forms for some iterator operations, to be used when the context guarantees the check isn't needed.
Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_aggregation_common.java uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_bag.java uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_set_sorted.java uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_singletype.java uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes.java uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_ordered.java uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_unordered.java uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LLUnambiguousIteratorImpl.java uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIterator.java Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_aggregation_common.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_aggregation_common.java?rev=1730763&r1=1730762&r2=1730763&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_aggregation_common.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_aggregation_common.java Tue Feb 16 22:35:41 2016 @@ -63,6 +63,10 @@ class FsIterator_aggregation_common<T ex } return iterators[lastValidIndex].get(); } + + public T getNvc() { + return iterators[lastValidIndex].getNvc(); + } public boolean isValid() { return lastValidIndex >= 0 && @@ -131,6 +135,25 @@ class FsIterator_aggregation_common<T ex lastValidIndex = iterators.length; // invalid position } + public void moveToNextNvc() { + FSIterator<T> it = iterators[lastValidIndex]; + it.moveToNextNvc(); + + if (it.isValid()) { + return; + } + + final int nbrIt = iterators.length; + for (int i = lastValidIndex + 1; i < nbrIt; i++) { + it = iterators[i]; + it.moveToFirst(); + if (it.isValid()) { + lastValidIndex = i; + return; + } + } + lastValidIndex = iterators.length; // invalid position + } public void moveToPrevious() { // No point in going anywhere if iterator is not valid. Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_bag.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_bag.java?rev=1730763&r1=1730762&r2=1730763&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_bag.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_bag.java Tue Feb 16 22:35:41 2016 @@ -61,6 +61,11 @@ class FsIterator_bag<T extends FeatureSt throw new NoSuchElementException(); } + public T getNvc() { + checkConcurrentModification(); + return bag.get(position); + } + /* (non-Javadoc) * @see org.apache.uima.cas.FSIterator#moveToFirst() */ @@ -93,6 +98,14 @@ class FsIterator_bag<T extends FeatureSt position = bag.moveToNextFilled(++position); } } + + @Override + public void moveToNextNvc() { + checkConcurrentModification(); + isGoingForward = true; + position = bag.moveToNextFilled(++position); + } + /* (non-Javadoc) * @see org.apache.uima.cas.FSIterator#moveToPrevious() Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_set_sorted.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_set_sorted.java?rev=1730763&r1=1730762&r2=1730763&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_set_sorted.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_set_sorted.java Tue Feb 16 22:35:41 2016 @@ -83,7 +83,11 @@ class FsIterator_set_sorted<T extends Fe if (!isValid()) { return; } + moveToNextNvc(); + } + @Override + public void moveToNextNvc() { checkConcurrentModification(); if (isGoingForward) { if (isCurrentElementFromLastGet) { @@ -104,6 +108,7 @@ class FsIterator_set_sorted<T extends Fe } } + @Override public void moveToPrevious() { if (!isValid()) { @@ -138,6 +143,16 @@ class FsIterator_set_sorted<T extends Fe checkConcurrentModification(); if (!isCurrentElementFromLastGet) { currentElement = iterator.next(); + isCurrentElementFromLastGet = true; + } + return currentElement; + } + + @Override + public T getNvc() { + checkConcurrentModification(); + if (!isCurrentElementFromLastGet) { + currentElement = iterator.next(); isCurrentElementFromLastGet = true; } return currentElement; Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_singletype.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_singletype.java?rev=1730763&r1=1730762&r2=1730763&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_singletype.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_singletype.java Tue Feb 16 22:35:41 2016 @@ -37,7 +37,7 @@ public abstract class FsIterator_singlet // subtypes do moveToFirst after they finish initialization } - protected <I extends FSIterator<T>> I checkConcurrentModification() { + final protected <I extends FSIterator<T>> I checkConcurrentModification() { if ((null != detectIllegalIndexUpdates) && (modificationSnapshot != detectIllegalIndexUpdates[typeCode])) { throw new ConcurrentModificationException(); } @@ -67,4 +67,5 @@ public abstract class FsIterator_singlet sb.append(", size: ").append(this.ll_indexSize()); return sb.toString(); } + } Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes.java?rev=1730763&r1=1730762&r2=1730763&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes.java Tue Feb 16 22:35:41 2016 @@ -58,8 +58,12 @@ public abstract class FsIterator_subtype @Override public TOP get() throws NoSuchElementException { throw new NoSuchElementException(); } @Override + public TOP getNvc() { throw new NoSuchElementException(); } + @Override public void moveToNext() {} @Override + public void moveToNextNvc() {} + @Override public void moveToPrevious() {} @Override public void moveToFirst() {} Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_ordered.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_ordered.java?rev=1730763&r1=1730762&r2=1730763&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_ordered.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_ordered.java Tue Feb 16 22:35:41 2016 @@ -122,46 +122,63 @@ public class FsIterator_subtypes_ordered it0.moveToNext(); heapify_down(it0, 1); } else { - // We need to increment everything. - int lvi = this.iterators.length - 1; - int i = 1; - while (i <= lvi) { - // Any iterator other than the current one needs to be - // incremented until it's pointing at something that's - // greater than the current element. - final FsIterator_singletype<T> it = iterators[i].checkConcurrentModification(); - // If the iterator we're considering is not valid, we - // set it to the first element. This should be it for this iterator... - if (!it.isValid()) { - it.moveToFirst(); - } - // Increment the iterator while it is valid and pointing - // at something smaller than the current element. - while (it.isValid() && is_before(it, it0, 1)) { - it.moveToNext(); - } - - // find placement - if (it.isValid()) { - heapify_up(it, i, 1); - ++i; - } else { - // swap this iterator with the last possibly valid one - // lvi might be equal to i, this will not be a problem - this.iterators[i] = this.iterators[lvi]; - this.iterators[lvi] = it; - --lvi; - } - } + moveToNextCmn(it0); + } + } - this.lastValidIndex = lvi; - this.wentForward = true; + @Override + public void moveToNextNvc() { + final FsIterator_singletype<T> it0 = iterators[0].checkConcurrentModification(); - it0.moveToNext(); + if (this.wentForward) { + it0.moveToNextNvc(); heapify_down(it0, 1); + } else { + moveToNextCmn(it0); } } + private void moveToNextCmn(final FsIterator_singletype<T> it0) { + // We need to increment everything. + int lvi = this.iterators.length - 1; + int i = 1; + while (i <= lvi) { + // Any iterator other than the current one needs to be + // incremented until it's pointing at something that's + // greater than the current element. + final FsIterator_singletype<T> it = iterators[i].checkConcurrentModification(); + // If the iterator we're considering is not valid, we + // set it to the first element. This should be it for this iterator... + if (!it.isValid()) { + it.moveToFirst(); + } + // Increment the iterator while it is valid and pointing + // at something smaller than the current element. + while (it.isValid() && is_before(it, it0, 1)) { + it.moveToNext(); + } + + // find placement + if (it.isValid()) { + heapify_up(it, i, 1); + ++i; + } else { + // swap this iterator with the last possibly valid one + // lvi might be equal to i, this will not be a problem + this.iterators[i] = this.iterators[lvi]; + this.iterators[lvi] = it; + --lvi; + } + } + + this.lastValidIndex = lvi; + this.wentForward = true; + + it0.moveToNext(); + heapify_down(it0, 1); + + } + @Override public void moveToPrevious() { if (!isValid()) { @@ -371,6 +388,14 @@ public class FsIterator_subtypes_ordered return iterators[0].checkConcurrentModification().get(); } + /* (non-Javadoc) + * @see org.apache.uima.cas.FSIterator#getNvc() + */ + @Override + public T getNvc() throws NoSuchElementException { + return iterators[0].checkConcurrentModification().get(); + } + /* (non-Javadoc) * @see org.apache.uima.cas.FSIterator#moveTo(org.apache.uima.cas.FeatureStructure) */ Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java?rev=1730763&r1=1730762&r2=1730763&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java Tue Feb 16 22:35:41 2016 @@ -67,6 +67,14 @@ public class FsIterator_subtypes_snapsho } /* (non-Javadoc) + * @see org.apache.uima.cas.FSIterator#get() + */ + @Override + public T getNvc() { + return snapshot[pos]; + } + + /* (non-Javadoc) * @see org.apache.uima.cas.FSIterator#moveToNext() */ @Override @@ -76,6 +84,11 @@ public class FsIterator_subtypes_snapsho } } + @Override + public void moveToNextNvc() { + pos++; + } + /* (non-Javadoc) * @see org.apache.uima.cas.FSIterator#moveToPrevious() */ Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_unordered.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_unordered.java?rev=1730763&r1=1730762&r2=1730763&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_unordered.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_unordered.java Tue Feb 16 22:35:41 2016 @@ -42,8 +42,12 @@ public class FsIterator_subtypes_unorder @Override public T get() throws NoSuchElementException {throw new UnsupportedOperationException();} @Override + public T getNvc() {throw new UnsupportedOperationException();} + @Override public void moveToNext() {throw new UnsupportedOperationException();} @Override + public void moveToNextNvc() {throw new UnsupportedOperationException();} + @Override public void moveToPrevious() {throw new UnsupportedOperationException();} @Override public void moveToFirst() {} // can't throw, should be a no-op. Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LLUnambiguousIteratorImpl.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LLUnambiguousIteratorImpl.java?rev=1730763&r1=1730762&r2=1730763&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LLUnambiguousIteratorImpl.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LLUnambiguousIteratorImpl.java Tue Feb 16 22:35:41 2016 @@ -44,7 +44,7 @@ public class LLUnambiguousIteratorImpl<T it.moveToFirst(); // Iterate over the input iterator. while (it.isValid()) { - FeatureStructure fs = it.next(); + FeatureStructure fs = it.nextNvc(); if (!(fs instanceof Annotation)) { continue; // skip until get an annotation } Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIterator.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIterator.java?rev=1730763&r1=1730762&r2=1730763&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIterator.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIterator.java Tue Feb 16 22:35:41 2016 @@ -56,6 +56,7 @@ public interface LowLevelIterator<T exte moveTo(ll_getIndex().getCasImpl().ll_getFSForRef(fsRef)); } + /** * Return the size of the underlying index. @@ -80,6 +81,8 @@ public interface LowLevelIterator<T exte @Override public FeatureStructure get() throws NoSuchElementException { throw new NoSuchElementException(); } @Override + public FeatureStructure getNvc() { throw new NoSuchElementException(); } + @Override public void moveTo(int i) {} @Override public void moveToFirst() {} @@ -90,6 +93,8 @@ public interface LowLevelIterator<T exte @Override public void moveToNext() {} @Override + public void moveToNextNvc() {} + @Override public void moveToPrevious() {} @Override public void moveTo(FeatureStructure fs) {}