/*
* Copyright (C) 2010 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 benchmarks.regression;
import com.google.caliper.Param;
import com.google.caliper.Runner;
import com.google.caliper.SimpleBenchmark;
import java.io.*;
import java.lang.reflect.*;
import java.util.*;
public class SerializationBenchmark extends SimpleBenchmark {
private static byte[] bytes(Object o) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
ObjectOutputStream out = new ObjectOutputStream(baos);
out.writeObject(o);
out.close();
return baos.toByteArray();
}
public void timeReadIntArray(int reps) throws Exception {
int[] intArray = new int[256];
readSingleObject(reps, intArray);
}
public void timeWriteIntArray(int reps) throws Exception {
int[] intArray = new int[256];
writeSingleObject(reps, intArray);
}
public void timeReadArrayListInteger(int reps) throws Exception {
ArrayList<Integer> object = new ArrayList<Integer>();
for (int i = 0; i < 256; ++i) {
object.add(i);
}
readSingleObject(reps, object);
}
public void timeWriteArrayListInteger(int reps) throws Exception {
ArrayList<Integer> object = new ArrayList<Integer>();
for (int i = 0; i < 256; ++i) {
object.add(i);
}
writeSingleObject(reps, object);
}
public void timeReadString(int reps) throws Exception {
readSingleObject(reps, "hello");
}
public void timeReadObjectStreamClass(int reps) throws Exception {
// A special case because serialization itself requires this class.
// (This should really be a unit test.)
ObjectStreamClass osc = ObjectStreamClass.lookup(String.class);
readSingleObject(reps, osc);
}
public void timeWriteString(int reps) throws Exception {
// String is a special case that avoids JNI.
writeSingleObject(reps, "hello");
}
public void timeWriteObjectStreamClass(int reps) throws Exception {
// A special case because serialization itself requires this class.
// (This should really be a unit test.)
ObjectStreamClass osc = ObjectStreamClass.lookup(String.class);
writeSingleObject(reps, osc);
}
// This is a baseline for the others.
public void timeWriteNoObjects(int reps) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
ObjectOutputStream out = new ObjectOutputStream(baos);
for (int rep = 0; rep < reps; ++rep) {
out.reset();
baos.reset();
}
out.close();
}
private void readSingleObject(int reps, Object object) throws Exception {
byte[] bytes = bytes(object);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
for (int rep = 0; rep < reps; ++rep) {
ObjectInputStream in = new ObjectInputStream(bais);
in.readObject();
in.close();
bais.reset();
}
}
private void writeSingleObject(int reps, Object o) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
ObjectOutputStream out = new ObjectOutputStream(baos);
for (int rep = 0; rep < reps; ++rep) {
out.writeObject(o);
out.reset();
baos.reset();
}
out.close();
}
public void timeWriteEveryKindOfField(int reps) throws Exception {
writeSingleObject(reps, new LittleBitOfEverything());
}
public void timeWriteSerializableBoolean(int reps) throws Exception {
writeSingleObject(reps, new SerializableBoolean());
}
public void timeWriteSerializableByte(int reps) throws Exception {
writeSingleObject(reps, new SerializableByte());
}
public void timeWriteSerializableChar(int reps) throws Exception {
writeSingleObject(reps, new SerializableChar());
}
public void timeWriteSerializableDouble(int reps) throws Exception {
writeSingleObject(reps, new SerializableDouble());
}
public void timeWriteSerializableFloat(int reps) throws Exception {
writeSingleObject(reps, new SerializableFloat());
}
public void timeWriteSerializableInt(int reps) throws Exception {
writeSingleObject(reps, new SerializableInt());
}
public void timeWriteSerializableLong(int reps) throws Exception {
writeSingleObject(reps, new SerializableLong());
}
public void timeWriteSerializableShort(int reps) throws Exception {
writeSingleObject(reps, new SerializableShort());
}
public void timeWriteSerializableReference(int reps) throws Exception {
writeSingleObject(reps, new SerializableReference());
}
public void timeReadEveryKindOfField(int reps) throws Exception {
readSingleObject(reps, new LittleBitOfEverything());
}
public void timeReadSerializableBoolean(int reps) throws Exception {
readSingleObject(reps, new SerializableBoolean());
}
public void timeReadSerializableByte(int reps) throws Exception {
readSingleObject(reps, new SerializableByte());
}
public void timeReadSerializableChar(int reps) throws Exception {
readSingleObject(reps, new SerializableChar());
}
public void timeReadSerializableDouble(int reps) throws Exception {
readSingleObject(reps, new SerializableDouble());
}
public void timeReadSerializableFloat(int reps) throws Exception {
readSingleObject(reps, new SerializableFloat());
}
public void timeReadSerializableInt(int reps) throws Exception {
readSingleObject(reps, new SerializableInt());
}
public void timeReadSerializableLong(int reps) throws Exception {
readSingleObject(reps, new SerializableLong());
}
public void timeReadSerializableShort(int reps) throws Exception {
readSingleObject(reps, new SerializableShort());
}
public void timeReadSerializableReference(int reps) throws Exception {
readSingleObject(reps, new SerializableReference());
}
public static class SerializableBoolean implements Serializable {
boolean z;
}
public static class SerializableByte implements Serializable {
byte b;
}
public static class SerializableChar implements Serializable {
char c;
}
public static class SerializableDouble implements Serializable {
double d;
}
public static class SerializableFloat implements Serializable {
float f;
}
public static class SerializableInt implements Serializable {
int i;
}
public static class SerializableLong implements Serializable {
long j;
}
public static class SerializableShort implements Serializable {
short s;
}
public static class SerializableReference implements Serializable {
Object l;
}
public static class LittleBitOfEverything implements Serializable {
boolean z;
byte b;
char c;
double d;
float f;
int i;
long j;
short s;
Object l;
}
}