Replace switch with if/else when processing whitespace. If/else is faster!

This commit is contained in:
Jesse Wilson 2012-08-27 04:17:29 +00:00
parent b0a172944a
commit bdf2cac6d4
2 changed files with 39 additions and 49 deletions

View File

@ -1312,14 +1312,11 @@ public class JsonReader implements Closeable {
}
int c = buffer[p++];
switch (c) {
case '\t':
case ' ':
case '\n':
case '\r':
if (c == ' ' || c == '\n' || c == '\r' || c == '\t') {
continue;
}
case '/':
if (c == '/') {
pos = p;
if (p == l) {
pos--; // push back '/' so it's still in the buffer when this method returns
@ -1354,8 +1351,7 @@ public class JsonReader implements Closeable {
default:
return c;
}
case '#':
} else if (c == '#') {
pos = p;
/*
* Skip a # hash end-of-line comment. The JSON RFC doesn't
@ -1366,9 +1362,7 @@ public class JsonReader implements Closeable {
skipToEndOfLine();
p = pos;
l = limit;
continue;
default:
} else {
pos = p;
return c;
}

View File

@ -146,45 +146,41 @@ public final class ParseBenchmark extends SimpleBenchmark {
jsonReader.close();
}
public void readObject(com.google.gson.stream.JsonReader reader) throws IOException {
reader.beginObject();
while (reader.hasNext()) {
reader.nextName();
readToken(reader);
}
reader.endObject();
}
public void readArray(com.google.gson.stream.JsonReader reader) throws IOException {
reader.beginArray();
while (reader.hasNext()) {
readToken(reader);
}
reader.endArray();
}
private void readToken(com.google.gson.stream.JsonReader reader) throws IOException {
switch (reader.peek()) {
case BEGIN_ARRAY:
readArray(reader);
break;
case BEGIN_OBJECT:
readObject(reader);
break;
case BOOLEAN:
reader.nextBoolean();
break;
case NULL:
reader.nextNull();
break;
case NUMBER:
reader.nextLong();
break;
case STRING:
reader.nextString();
break;
default:
throw new IllegalArgumentException("Unexpected token" + reader.peek());
while (true) {
switch (reader.peek()) {
case BEGIN_ARRAY:
reader.beginArray();
break;
case END_ARRAY:
reader.endArray();
break;
case BEGIN_OBJECT:
reader.beginObject();
break;
case END_OBJECT:
reader.endObject();
break;
case NAME:
reader.nextName();
break;
case BOOLEAN:
reader.nextBoolean();
break;
case NULL:
reader.nextNull();
break;
case NUMBER:
reader.nextLong();
break;
case STRING:
reader.nextString();
break;
case END_DOCUMENT:
return;
default:
throw new IllegalArgumentException("Unexpected token" + reader.peek());
}
}
}
}