package serializers;
import java.io.PrintWriter;
/**
* Intermediate base class for tests that use a single <code>MediaItem</code>
* as data.
* The only method missing is <code>addTests</code>, which defines codecs to use.
*/
public abstract class MediaItemBenchmark extends BenchmarkBase
{
public MediaItemBenchmark() { }
protected void runBenchmark(String[] args) {
runBenchmark(args,
Create,
Serialize,
Deserialize);
}
@Override
protected <J> byte[] serializeForSize(Transformer<J,Object> transformer, Serializer<Object> serializer, J value)
throws Exception
{
return serializer.serialize(transformer.forward(value));
}
@Override
protected <J> void checkCorrectness(PrintWriter errors, Transformer<J,Object> transformer,
Serializer<Object> serializer, J value)
throws Exception
{
checkSingleItem(errors, transformer, serializer, value);
}
@Override
protected Object convertTestData(TestGroup.Entry<?,Object> loader, Params params, byte[] data)
throws Exception
{
Object deserialized = loader.serializer.deserialize(data);
return loader.transformer.reverse(deserialized);
}
// ------------------------------------------------------------------------------------
// Test case objects
// ------------------------------------------------------------------------------------
protected final TestCase Create = new TestCase()
{
public <J> double run(Transformer<J,Object> transformer, Serializer<Object> serializer, J value, int iterations) throws Exception
{
long start = System.nanoTime();
for (int i = 0; i < iterations; i++)
{
transformer.forward(value);
}
return iterationTime(System.nanoTime() - start, iterations);
}
};
protected final TestCase Serialize = new TestCase()
{
public <J> double run(Transformer<J,Object> transformer, Serializer<Object> serializer, J value, int iterations) throws Exception
{
/* 16-Nov-2012, tatu: Time to serialize should consider time to
* convert from POJO to intermediate representation, because
* some format libs (Avro) do significant amount of pre-processing.
* We could do this by adding Create time as well, but this should
* model usual usage bit more accurately.
*/
Object[] objects = new Object[iterations];
long start = System.nanoTime();
for (int i = 0; i < iterations; i++) {
Object input = transformer.forward(value);
objects[i] = serializer.serialize(input);
}
return iterationTime(System.nanoTime() - start, iterations);
}
};
protected final TestCase Deserialize = new TestCase()
{
public <J> double run(Transformer<J,Object> transformer, Serializer<Object> serializer, J value, int iterations) throws Exception
{
byte[] array = serializer.serialize(transformer.forward(value));
long start = System.nanoTime();
for (int i = 0; i < iterations; i++)
{
serializer.deserialize(array);
}
return iterationTime(System.nanoTime() - start, iterations);
}
};
// 16-May-2012, Nate: As discussed on mailing list, removed these two as they only exist in an attempt to
// make the comparison with ActiveMQProtobuf fair with the rest of the serializers. This adds overhead to
// the rest of the serializers, skewing the results. ActiveMQProtobuf has been disabled, so these aren't needed.
// protected final TestCase DeserializeAndCheck = new TestCase()
// {
// public <J> double run(Transformer<J,Object> transformer, Serializer<Object> serializer, J value, int iterations) throws Exception
// {
// byte[] array = serializer.serialize(transformer.forward(value));
// long start = System.nanoTime();
// for (int i = 0; i < iterations; i++)
// {
// Object obj = serializer.deserialize(array);
// transformer.reverse(obj);
// }
// return iterationTime(System.nanoTime() - start, iterations);
// }
// };
//
// protected final TestCase DeserializeAndCheckShallow = new TestCase()
// {
// public <J> double run(Transformer<J,Object> transformer, Serializer<Object> serializer, J value, int iterations) throws Exception
// {
// byte[] array = serializer.serialize(transformer.forward(value));
// long start = System.nanoTime();
// for (int i = 0; i < iterations; i++)
// {
// Object obj = serializer.deserialize(array);
// transformer.shallowReverse(obj);
// }
// return iterationTime(System.nanoTime() - start, iterations);
// }
// };
}