Skip to content

Commit bdf2cac

Browse files
committed
Replace switch with if/else when processing whitespace. If/else is faster!
1 parent b0a1729 commit bdf2cac

File tree

2 files changed

+39
-49
lines changed

2 files changed

+39
-49
lines changed

gson/src/main/java/com/google/gson/stream/JsonReader.java

+5-11
Original file line numberDiff line numberDiff line change
@@ -1312,14 +1312,11 @@ private int nextNonWhitespace(boolean throwOnEof) throws IOException {
13121312
}
13131313

13141314
int c = buffer[p++];
1315-
switch (c) {
1316-
case '\t':
1317-
case ' ':
1318-
case '\n':
1319-
case '\r':
1315+
if (c == ' ' || c == '\n' || c == '\r' || c == '\t') {
13201316
continue;
1317+
}
13211318

1322-
case '/':
1319+
if (c == '/') {
13231320
pos = p;
13241321
if (p == l) {
13251322
pos--; // push back '/' so it's still in the buffer when this method returns
@@ -1354,8 +1351,7 @@ private int nextNonWhitespace(boolean throwOnEof) throws IOException {
13541351
default:
13551352
return c;
13561353
}
1357-
1358-
case '#':
1354+
} else if (c == '#') {
13591355
pos = p;
13601356
/*
13611357
* Skip a # hash end-of-line comment. The JSON RFC doesn't
@@ -1366,9 +1362,7 @@ private int nextNonWhitespace(boolean throwOnEof) throws IOException {
13661362
skipToEndOfLine();
13671363
p = pos;
13681364
l = limit;
1369-
continue;
1370-
1371-
default:
1365+
} else {
13721366
pos = p;
13731367
return c;
13741368
}

metrics/src/main/java/com/google/gson/metrics/ParseBenchmark.java

+34-38
Original file line numberDiff line numberDiff line change
@@ -146,45 +146,41 @@ public void parse(char[] data, Document document) throws Exception {
146146
jsonReader.close();
147147
}
148148

149-
public void readObject(com.google.gson.stream.JsonReader reader) throws IOException {
150-
reader.beginObject();
151-
while (reader.hasNext()) {
152-
reader.nextName();
153-
readToken(reader);
154-
}
155-
reader.endObject();
156-
}
157-
158-
public void readArray(com.google.gson.stream.JsonReader reader) throws IOException {
159-
reader.beginArray();
160-
while (reader.hasNext()) {
161-
readToken(reader);
162-
}
163-
reader.endArray();
164-
}
165-
166149
private void readToken(com.google.gson.stream.JsonReader reader) throws IOException {
167-
switch (reader.peek()) {
168-
case BEGIN_ARRAY:
169-
readArray(reader);
170-
break;
171-
case BEGIN_OBJECT:
172-
readObject(reader);
173-
break;
174-
case BOOLEAN:
175-
reader.nextBoolean();
176-
break;
177-
case NULL:
178-
reader.nextNull();
179-
break;
180-
case NUMBER:
181-
reader.nextLong();
182-
break;
183-
case STRING:
184-
reader.nextString();
185-
break;
186-
default:
187-
throw new IllegalArgumentException("Unexpected token" + reader.peek());
150+
while (true) {
151+
switch (reader.peek()) {
152+
case BEGIN_ARRAY:
153+
reader.beginArray();
154+
break;
155+
case END_ARRAY:
156+
reader.endArray();
157+
break;
158+
case BEGIN_OBJECT:
159+
reader.beginObject();
160+
break;
161+
case END_OBJECT:
162+
reader.endObject();
163+
break;
164+
case NAME:
165+
reader.nextName();
166+
break;
167+
case BOOLEAN:
168+
reader.nextBoolean();
169+
break;
170+
case NULL:
171+
reader.nextNull();
172+
break;
173+
case NUMBER:
174+
reader.nextLong();
175+
break;
176+
case STRING:
177+
reader.nextString();
178+
break;
179+
case END_DOCUMENT:
180+
return;
181+
default:
182+
throw new IllegalArgumentException("Unexpected token" + reader.peek());
183+
}
188184
}
189185
}
190186
}

0 commit comments

Comments
 (0)