forked from google/gson
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Split up benchmarks into specific types for serialization and deseria…
…lization.
- Loading branch information
Showing
3 changed files
with
240 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
140 changes: 140 additions & 0 deletions
140
metrics/src/main/java/com/google/gson/metrics/CollectionsDeserializationBenchmark.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
/* | ||
* Copyright (C) 2011 Google Inc. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package com.google.gson.metrics; | ||
|
||
import java.io.IOException; | ||
import java.io.StringReader; | ||
import java.lang.reflect.Field; | ||
import java.lang.reflect.Type; | ||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
import com.google.caliper.Runner; | ||
import com.google.caliper.SimpleBenchmark; | ||
import com.google.gson.Gson; | ||
import com.google.gson.reflect.TypeToken; | ||
import com.google.gson.stream.JsonReader; | ||
|
||
/** | ||
* Caliper based micro benchmarks for Gson | ||
* | ||
* @author Inderjeet Singh | ||
*/ | ||
public class CollectionsDeserializationBenchmark extends SimpleBenchmark { | ||
|
||
private static final Type LIST_TYPE = new TypeToken<List<BagOfPrimitives>>(){}.getType(); | ||
private Gson gson; | ||
private String json; | ||
|
||
public static void main(String[] args) { | ||
Runner.main(CollectionsDeserializationBenchmark.class, args); | ||
} | ||
|
||
@Override | ||
protected void setUp() throws Exception { | ||
this.gson = new Gson(); | ||
List<BagOfPrimitives> bags = new ArrayList<BagOfPrimitives>(); | ||
for (int i = 0; i < 100; ++i) { | ||
bags.add(new BagOfPrimitives(10L, 1, false, "foo")); | ||
} | ||
this.json = gson.toJson(bags, LIST_TYPE); | ||
} | ||
|
||
/** | ||
* Benchmark to measure Gson performance for deserializing an object | ||
*/ | ||
public void timeCollectionsDefault(int reps) { | ||
for (int i=0; i<reps; ++i) { | ||
gson.fromJson(json, LIST_TYPE); | ||
} | ||
} | ||
|
||
/** | ||
* Benchmark to measure deserializing objects by hand | ||
*/ | ||
public void timeCollectionsStreaming(int reps) throws IOException { | ||
for (int i=0; i<reps; ++i) { | ||
StringReader reader = new StringReader(json); | ||
JsonReader jr = new JsonReader(reader); | ||
jr.beginArray(); | ||
List<BagOfPrimitives> bags = new ArrayList<BagOfPrimitives>(); | ||
while(jr.hasNext()) { | ||
jr.beginObject(); | ||
long longValue = 0; | ||
int intValue = 0; | ||
boolean booleanValue = false; | ||
String stringValue = null; | ||
while(jr.hasNext()) { | ||
String name = jr.nextName(); | ||
if (name.equals("longValue")) { | ||
longValue = jr.nextLong(); | ||
} else if (name.equals("intValue")) { | ||
intValue = jr.nextInt(); | ||
} else if (name.equals("booleanValue")) { | ||
booleanValue = jr.nextBoolean(); | ||
} else if (name.equals("stringValue")) { | ||
stringValue = jr.nextString(); | ||
} else { | ||
throw new IOException("Unexpected name: " + name); | ||
} | ||
} | ||
jr.endObject(); | ||
bags.add(new BagOfPrimitives(longValue, intValue, booleanValue, stringValue)); | ||
} | ||
jr.endArray(); | ||
} | ||
} | ||
|
||
/** | ||
* This benchmark measures the ideal Gson performance: the cost of parsing a JSON stream and | ||
* setting object values by reflection. We should strive to reduce the discrepancy between this | ||
* and {@link #timeCollectionsDefault(int)} . | ||
*/ | ||
public void timeCollectionsReflectionStreaming(int reps) throws Exception { | ||
for (int i=0; i<reps; ++i) { | ||
StringReader reader = new StringReader(json); | ||
JsonReader jr = new JsonReader(reader); | ||
jr.beginArray(); | ||
List<BagOfPrimitives> bags = new ArrayList<BagOfPrimitives>(); | ||
while(jr.hasNext()) { | ||
jr.beginObject(); | ||
BagOfPrimitives bag = new BagOfPrimitives(); | ||
while(jr.hasNext()) { | ||
String name = jr.nextName(); | ||
for (Field field : BagOfPrimitives.class.getDeclaredFields()) { | ||
if (field.getName().equals(name)) { | ||
Class<?> fieldType = field.getType(); | ||
if (fieldType.equals(long.class)) { | ||
field.setLong(bag, jr.nextLong()); | ||
} else if (fieldType.equals(int.class)) { | ||
field.setInt(bag, jr.nextInt()); | ||
} else if (fieldType.equals(boolean.class)) { | ||
field.setBoolean(bag, jr.nextBoolean()); | ||
} else if (fieldType.equals(String.class)) { | ||
field.set(bag, jr.nextString()); | ||
} else { | ||
throw new RuntimeException("Unexpected: type: " + fieldType + ", name: " + name); | ||
} | ||
} | ||
} | ||
} | ||
jr.endObject(); | ||
bags.add(bag); | ||
} | ||
jr.endArray(); | ||
} | ||
} | ||
} |
53 changes: 53 additions & 0 deletions
53
metrics/src/main/java/com/google/gson/metrics/SerializationBenchmark.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
/* | ||
* Copyright (C) 2011 Google Inc. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package com.google.gson.metrics; | ||
|
||
import com.google.caliper.Param; | ||
import com.google.caliper.Runner; | ||
import com.google.caliper.SimpleBenchmark; | ||
import com.google.gson.Gson; | ||
import com.google.gson.GsonBuilder; | ||
|
||
/** | ||
* Caliper based micro benchmarks for Gson serialization | ||
* | ||
* @author Inderjeet Singh | ||
* @author Jesse Wilson | ||
* @author Joel Leitch | ||
*/ | ||
public class SerializationBenchmark extends SimpleBenchmark { | ||
|
||
private Gson gson; | ||
private BagOfPrimitives bag; | ||
@Param | ||
private boolean pretty; | ||
|
||
public static void main(String[] args) { | ||
Runner.main(SerializationBenchmark.class, args); | ||
} | ||
|
||
@Override | ||
protected void setUp() throws Exception { | ||
this.gson = pretty ? new GsonBuilder().setPrettyPrinting().create() : new Gson(); | ||
this.bag = new BagOfPrimitives(10L, 1, false, "foo"); | ||
} | ||
|
||
public void timeObjectSerialization(int reps) { | ||
for (int i=0; i<reps; ++i) { | ||
gson.toJson(bag); | ||
} | ||
} | ||
} |