decrese number of iterator() invocations -> less object creations, faster.
Even jvm_serializers show deserialization time difference 209893 -> 197058. My guess - effect mostly from GC.
diff --git a/src/main/java/org/yaml/snakeyaml/scanner/ScannerImpl.java b/src/main/java/org/yaml/snakeyaml/scanner/ScannerImpl.java
index 74277bd..9c26246 100644
--- a/src/main/java/org/yaml/snakeyaml/scanner/ScannerImpl.java
+++ b/src/main/java/org/yaml/snakeyaml/scanner/ScannerImpl.java
@@ -371,10 +371,8 @@
* the implementation is not as in PyYAML. Because
* this.possibleSimpleKeys is ordered we can simply take the first key
*/
- Iterator<SimpleKey> iter = this.possibleSimpleKeys.values().iterator();
- if (iter.hasNext()) {
- SimpleKey key = iter.next();
- return key.getTokenNumber();
+ if (!this.possibleSimpleKeys.isEmpty()) {
+ return this.possibleSimpleKeys.values().iterator().next().getTokenNumber();
}
return -1;
}
@@ -391,16 +389,18 @@
*/
private void stalePossibleSimpleKeys() {
// use toRemove to avoid java.util.ConcurrentModificationException
- for (Iterator<Entry<Integer, SimpleKey>> iterator = this.possibleSimpleKeys.entrySet()
- .iterator(); iterator.hasNext();) {
- Entry<Integer, SimpleKey> level = iterator.next();
- SimpleKey key = level.getValue();
- if ((key.getLine() != reader.getLine()) || (reader.getIndex() - key.getIndex() > 1024)) {
- if (key.isRequired()) {
- throw new ScannerException("while scanning a simple key", key.getMark(),
- "could not found expected ':'", reader.getMark());
+ if (!this.possibleSimpleKeys.isEmpty()) {
+ for (Iterator<SimpleKey> iterator = this.possibleSimpleKeys.values().iterator(); iterator
+ .hasNext();) {
+ SimpleKey key = iterator.next();
+ if ((key.getLine() != reader.getLine())
+ || (reader.getIndex() - key.getIndex() > 1024)) {
+ if (key.isRequired()) {
+ throw new ScannerException("while scanning a simple key", key.getMark(),
+ "could not found expected ':'", reader.getMark());
+ }
+ iterator.remove();
}
- iterator.remove();
}
}
}
@@ -432,8 +432,8 @@
if (this.allowSimpleKey) {
removePossibleSimpleKey();
int tokenNumber = this.tokensTaken + this.tokens.size();
- SimpleKey key = new SimpleKey(tokenNumber, required, reader.getIndex(), reader
- .getLine(), this.reader.getColumn(), this.reader.getMark());
+ SimpleKey key = new SimpleKey(tokenNumber, required, reader.getIndex(),
+ reader.getLine(), this.reader.getColumn(), this.reader.getMark());
this.possibleSimpleKeys.put(this.flowLevel, key);
}
}
@@ -680,8 +680,8 @@
if (this.flowLevel == 0) {
// Are we allowed to start a key (not necessary a simple)?
if (!this.allowSimpleKey) {
- throw new ScannerException(null, null, "mapping keys are not allowed here", reader
- .getMark());
+ throw new ScannerException(null, null, "mapping keys are not allowed here",
+ reader.getMark());
}
// We may need to add BLOCK-MAPPING-START.
if (addIndent(this.reader.getColumn())) {
@@ -1161,8 +1161,8 @@
}
if (length == 0) {
throw new ScannerException("while scanning an " + name, startMark,
- "expected alphabetic or numeric character, but found but found " + ch, reader
- .getMark());
+ "expected alphabetic or numeric character, but found but found " + ch,
+ reader.getMark());
}
String value = reader.prefixForward(length);
ch = reader.peek();
@@ -1329,8 +1329,8 @@
increment = Integer.parseInt(String.valueOf(ch));
if (increment == 0) {
throw new ScannerException("while scanning a block scalar", startMark,
- "expected indentation indicator in the range 1-9, but found 0", reader
- .getMark());
+ "expected indentation indicator in the range 1-9, but found 0",
+ reader.getMark());
}
reader.forward();
}
@@ -1338,8 +1338,8 @@
increment = Integer.parseInt(String.valueOf(ch));
if (increment == 0) {
throw new ScannerException("while scanning a block scalar", startMark,
- "expected indentation indicator in the range 1-9, but found 0", reader
- .getMark());
+ "expected indentation indicator in the range 1-9, but found 0",
+ reader.getMark());
}
reader.forward();
ch = reader.peek();
@@ -1355,8 +1355,8 @@
ch = reader.peek();
if (Constant.NULL_BL_LINEBR.hasNo(ch)) {
throw new ScannerException("while scanning a block scalar", startMark,
- "expected chomping or indentation indicators, but found " + ch, reader
- .getMark());
+ "expected chomping or indentation indicators, but found " + ch,
+ reader.getMark());
}
return new Chomping(chomping, increment);
}
@@ -1501,8 +1501,8 @@
if (NOT_HEXA.matcher(hex).find()) {
throw new ScannerException("while scanning a double-quoted scalar",
startMark, "expected escape sequence of " + length
- + " hexadecimal numbers, but found: " + hex, reader
- .getMark());
+ + " hexadecimal numbers, but found: " + hex,
+ reader.getMark());
}
char unicode = (char) Integer.parseInt(hex, 16);
chunks.append(unicode);
@@ -1511,8 +1511,8 @@
chunks.append(scanFlowScalarBreaks(startMark));
} else {
throw new ScannerException("while scanning a double-quoted scalar", startMark,
- "found unknown escape character " + ch + "(" + ((int) ch) + ")", reader
- .getMark());
+ "found unknown escape character " + ch + "(" + ((int) ch) + ")",
+ reader.getMark());
}
} else {
return chunks.toString();
@@ -1751,8 +1751,8 @@
throw new ScannerException("while scanning a " + name, startMark,
"expected URI escape sequence of 2 hexadecimal numbers, but found "
+ reader.peek() + "(" + ((int) reader.peek()) + ") and "
- + reader.peek(1) + "(" + ((int) reader.peek(1)) + ")", reader
- .getMark());
+ + reader.peek(1) + "(" + ((int) reader.peek(1)) + ")",
+ reader.getMark());
}
reader.forward(2);
}