提交 6f649601 编写于 作者: P peytoia

6868503: RuleBasedBreakIterator is inefficient

Reviewed-by: okutsu
上级 6140c8ba
...@@ -621,6 +621,8 @@ class RuleBasedBreakIterator extends BreakIterator { ...@@ -621,6 +621,8 @@ class RuleBasedBreakIterator extends BreakIterator {
return handleNext(); return handleNext();
} }
private int cachedLastKnownBreak = BreakIterator.DONE;
/** /**
* Advances the iterator backwards, to the last boundary preceding this one. * Advances the iterator backwards, to the last boundary preceding this one.
* @return The position of the last boundary position preceding this one. * @return The position of the last boundary position preceding this one.
...@@ -638,8 +640,16 @@ class RuleBasedBreakIterator extends BreakIterator { ...@@ -638,8 +640,16 @@ class RuleBasedBreakIterator extends BreakIterator {
// the current position), but not necessarily the last one before // the current position), but not necessarily the last one before
// where we started // where we started
int start = current(); int start = current();
getPrevious(); int lastResult = cachedLastKnownBreak;
int lastResult = handlePrevious(); if (lastResult >= start || lastResult <= BreakIterator.DONE) {
getPrevious();
lastResult = handlePrevious();
} else {
//it might be better to check if handlePrevious() give us closer
//safe value but handlePrevious() is slow too
//So, this has to be done carefully
text.setIndex(lastResult);
}
int result = lastResult; int result = lastResult;
// iterate forward from the known break position until we pass our // iterate forward from the known break position until we pass our
...@@ -653,6 +663,7 @@ class RuleBasedBreakIterator extends BreakIterator { ...@@ -653,6 +663,7 @@ class RuleBasedBreakIterator extends BreakIterator {
// set the current iteration position to be the last break position // set the current iteration position to be the last break position
// before where we started, and then return that value // before where we started, and then return that value
text.setIndex(lastResult); text.setIndex(lastResult);
cachedLastKnownBreak = lastResult;
return lastResult; return lastResult;
} }
...@@ -757,7 +768,8 @@ class RuleBasedBreakIterator extends BreakIterator { ...@@ -757,7 +768,8 @@ class RuleBasedBreakIterator extends BreakIterator {
// then we can just use next() to get our return value // then we can just use next() to get our return value
text.setIndex(offset); text.setIndex(offset);
if (offset == text.getBeginIndex()) { if (offset == text.getBeginIndex()) {
return handleNext(); cachedLastKnownBreak = handleNext();
return cachedLastKnownBreak;
} }
// otherwise, we have to sync up first. Use handlePrevious() to back // otherwise, we have to sync up first. Use handlePrevious() to back
...@@ -767,10 +779,19 @@ class RuleBasedBreakIterator extends BreakIterator { ...@@ -767,10 +779,19 @@ class RuleBasedBreakIterator extends BreakIterator {
// position at or before our starting position. Advance forward // position at or before our starting position. Advance forward
// from here until we've passed the starting position. The position // from here until we've passed the starting position. The position
// we stop on will be the first break position after the specified one. // we stop on will be the first break position after the specified one.
int result = handlePrevious(); int result = cachedLastKnownBreak;
if (result >= offset || result <= BreakIterator.DONE) {
result = handlePrevious();
} else {
//it might be better to check if handlePrevious() give us closer
//safe value but handlePrevious() is slow too
//So, this has to be done carefully
text.setIndex(result);
}
while (result != BreakIterator.DONE && result <= offset) { while (result != BreakIterator.DONE && result <= offset) {
result = handleNext(); result = handleNext();
} }
cachedLastKnownBreak = result;
return result; return result;
} }
...@@ -865,6 +886,8 @@ class RuleBasedBreakIterator extends BreakIterator { ...@@ -865,6 +886,8 @@ class RuleBasedBreakIterator extends BreakIterator {
text = new SafeCharIterator(newText); text = new SafeCharIterator(newText);
} }
text.first(); text.first();
cachedLastKnownBreak = BreakIterator.DONE;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册