blob: de48b166d14c1540cc0c478bf99063513775d994 [file] [log] [blame]
package perf;
import java.io.*;
import org.codehaus.jackson.*;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.smile.SmileFactory;
import org.codehaus.jackson.smile.SmileGenerator;
import org.codehaus.jackson.util.TokenBuffer;
public final class TestCopyPerf
{
private final int REPS;
final JsonFactory _jsonFactory;
final SmileFactory _smileFactory;
final TokenBuffer _tokens;
private TestCopyPerf(File f)
throws Exception
{
_jsonFactory = new JsonFactory();
_smileFactory = new SmileFactory();
// whether to use back-refs for field names has measurable impact on ser/deser (but different direction):
// _smileFactory.configure(SmileGenerator.Feature.CHECK_SHARED_NAMES, false);
_smileFactory.configure(SmileGenerator.Feature.CHECK_SHARED_NAMES, true);
_smileFactory.configure(SmileGenerator.Feature.CHECK_SHARED_STRING_VALUES, true);
FileInputStream fis = new FileInputStream(f);
ObjectMapper mapper = new ObjectMapper();
JsonParser jp = _jsonFactory.createJsonParser(fis);
_tokens = mapper.readValue(jp, TokenBuffer.class);
// Let's try to guestimate suitable size... to get about 20 megs copied
REPS = (int) ((double) (20 * 1000 * 1000) / (double) f.length());
jp.close();
}
public void test()
throws Exception
{
ByteArrayOutputStream bos = new ByteArrayOutputStream(2000);
testCopy(1, bos, 0);
System.out.println("Output length: "+bos.size()+"; will do "+REPS+" writes per round");
System.out.println();
int round = 0;
while (true) {
try { Thread.sleep(100L); } catch (InterruptedException ie) { }
testCopy(REPS, bos, round);
++round;
}
}
private long testCopy(int reps, ByteArrayOutputStream bos, int round)
throws IOException
{
int mode = (round % 2);
if (mode == 0) System.out.println();
JsonGenerator jg = null;
final long start = System.currentTimeMillis();
while (--reps >= 0) {
bos.reset();
switch (mode) {
case 0:
jg = _smileFactory.createJsonGenerator(bos);
break;
case 1:
jg = _jsonFactory.createJsonGenerator(bos, JsonEncoding.UTF8);
break;
default:
throw new Error();
}
JsonParser jp = _tokens.asParser();
while (jp.nextToken() != null) {
jg.copyCurrentEvent(jp);
}
jp.close();
jg.close();
}
long time = System.currentTimeMillis() - start;
System.out.println("Took "+time+" msecs (round "+round+"; bytes "+bos.size()+") for "+jg.getClass().getName());
return time;
}
public static void main(String[] args)
throws Exception
{
if (args.length != 1) {
System.err.println("Usage: java ... <file>");
System.exit(1);
}
new TestCopyPerf(new File(args[0])).test();
}
}