BinaryXmlIOComparison.java
package gov.usgs.earthquake.product.io;
import gov.usgs.earthquake.product.Product;
import gov.usgs.util.StreamUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Date;
/**
* Compare io times of XML and Binary product formats.
*
* All conversion is done in memory to try to balance the tests. All writes use
* a BinaryProductSource to keep the playing field level.
*/
public class BinaryXmlIOComparison {
/**
* Serializes product by streaming it to a handler
* @param source a productSource
* @param handler a productHandler
* @return Time it took to stream source to handler
* @throws Exception if error occurs
*/
public static long timeSerializeProduct(final ProductSource source,
final ProductHandler handler) throws Exception {
Date start = new Date();
source.streamTo(handler);
Date end = new Date();
return end.getTime() - start.getTime();
}
/**
* Testing for class
* @param args CLI args
* @throws Exception if error occurs
*/
public static void main(final String[] args) throws Exception {
int numRuns = 10;
testProductIO(
ObjectProductHandler.getProduct(new BinaryProductSource(
StreamUtils.getInputStream(new File(
"etc/test_products/se082311a/us_dyfi_se082311a_1314562782198.bin")))),
numRuns);
testProductIO(
ObjectProductHandler.getProduct(new BinaryProductSource(
StreamUtils.getInputStream(new File(
"etc/test_products/usa00040xz/us_shakemap_usa00040xz_1287260900624.bin")))),
numRuns);
testProductIO(
ObjectProductHandler.getProduct(new BinaryProductSource(
StreamUtils.getInputStream(new File(
"etc/test_products/usa00040xz/us_losspager_usa00040xz_1287260989064.bin")))),
numRuns);
}
/**
* Tests product IO
* @param product Produc
* @param numRuns int
* @throws Exception if error occurs
*/
public static void testProductIO(final Product product, int numRuns)
throws Exception {
System.err.println(product.getId().toString());
testXmlReads(product, numRuns);
testXmlWrites(product, numRuns);
testBinaryReads(product, numRuns);
testBinaryWrites(product, numRuns);
System.err.println();
}
/**
* Tests XML reading
* @param product a product
* @param numReads int
* @throws Exception if error occurs
*/
public static void testXmlReads(final Product product, int numReads)
throws Exception {
// read product into memory
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new ObjectProductSource(product).streamTo(new XmlProductHandler(baos));
byte[] bytes = baos.toByteArray();
long time = 0L;
for (int i = 0; i < numReads; i++) {
Date start = new Date();
// parse from memory
ObjectProductHandler.getProduct(new XmlProductSource(StreamUtils
.getInputStream(bytes)));
Date end = new Date();
time += end.getTime() - start.getTime();
}
System.err.println("xml\tlength=" + bytes.length + ",\tnumReads="
+ numReads + ",\tread average=" + ((double) time / numReads));
}
/**
* Tests binary reading
* @param product a product
* @param numReads int
* @throws Exception if error occurs
*/
public static void testBinaryReads(final Product product, int numReads)
throws Exception {
// read product into memory
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new ObjectProductSource(product)
.streamTo(new BinaryProductHandler(baos));
byte[] bytes = baos.toByteArray();
long time = 0L;
for (int i = 0; i < numReads; i++) {
Date start = new Date();
// parse from memory
ObjectProductHandler.getProduct(new BinaryProductSource(StreamUtils
.getInputStream(bytes)));
Date end = new Date();
time += end.getTime() - start.getTime();
}
System.err.println("binary\tlength=" + bytes.length + ",\tnumReads="
+ numReads + ",\tread average=" + ((double) time / numReads));
}
/**
* Tests binary writes
* @param product a product
* @param numWrites int
* @throws Exception if error occurs
*/
public static void testBinaryWrites(final Product product, int numWrites)
throws Exception {
// read product into memory
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new ObjectProductSource(product)
.streamTo(new BinaryProductHandler(baos));
byte[] bytes = baos.toByteArray();
long time = 0L;
for (int i = 0; i < numWrites; i++) {
baos.reset();
Date start = new Date();
// parse from memory
new BinaryProductSource(StreamUtils.getInputStream(bytes))
.streamTo(new BinaryProductHandler(baos));
Date end = new Date();
time += end.getTime() - start.getTime();
}
System.err.println("binary\tlength=" + baos.toByteArray().length
+ ",\tnumWrites=" + numWrites + ",\twrite average="
+ ((double) time / numWrites));
}
/**
* tests xml writes
* @param product a product
* @param numWrites int
* @throws Exception if error occurs
*/
public static void testXmlWrites(final Product product, int numWrites)
throws Exception {
// read product into memory
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new ObjectProductSource(product)
.streamTo(new BinaryProductHandler(baos));
byte[] bytes = baos.toByteArray();
long time = 0L;
for (int i = 0; i < numWrites; i++) {
baos.reset();
Date start = new Date();
// parse from memory
new BinaryProductSource(StreamUtils.getInputStream(bytes))
.streamTo(new XmlProductHandler(baos));
Date end = new Date();
time += end.getTime() - start.getTime();
}
System.err.println("xml\tlength=" + baos.toByteArray().length
+ ",\tnumWrites=" + numWrites + ",\twrite average="
+ ((double) time / numWrites));
}
}