package com.alibaba.json.test.benchmark; import java.lang.management.ManagementFactory; import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; import javax.management.MBeanServer; import javax.management.ObjectName; import com.alibaba.json.test.codec.Codec; public class BenchmarkExecutor { private int loopCount = 1000; private int executeCount = 10; private final List<Codec> codecList = new ArrayList<Codec>(); private final List<BenchmarkCase> caseList = new ArrayList<BenchmarkCase>(); public List<BenchmarkCase> getCaseList() { return caseList; } public List<Codec> getCodecList() { return codecList; } public int getLoopCount() { return loopCount; } public int getExecuteCount() { return executeCount; } public void setExecuteCount(int executeCount) { this.executeCount = executeCount; } public void setLoopCount(int loopCount) { this.loopCount = loopCount; } public void execute() { System.out.println(System.getProperty("java.vm.name") + " " + System.getProperty("java.runtime.version")); for (BenchmarkCase benchmarkCase : caseList) { for (Codec codec : codecList) { try { benchmarkCase.init(codec); } catch (Exception e) { e.printStackTrace(); break; } for (int i = 0; i < executeCount; ++i) { Result result = executeLoop(codec, benchmarkCase); handleResult(codec, result); } System.out.println(); } } } public void handleResult(Codec codec, Result result) { if (result.getError() != null) { result.getError().printStackTrace(); return; } NumberFormat format = NumberFormat.getInstance(); System.out.println(result.getName() + "\t" + codec.getName() + "\t" + format.format(result.getMillis()) + "\tYGC " + result.getYoungGC() + "\tYGCT " + result.getYoungGCTime()); } private Result executeLoop(Codec codec, BenchmarkCase benchmarkCase) { long startMillis = System.currentTimeMillis(); long startYoungGC = getYoungGC(); long startYoungGCTime = getYoungGCTime(); long startFullGC = getFullGC(); Throwable error = null; try { for (int i = 0; i < loopCount; ++i) { benchmarkCase.execute(codec); } } catch (Throwable e) { error = e; } long time = System.currentTimeMillis() - startMillis; long youngGC = getYoungGC() - startYoungGC; long youngGCTime = getYoungGCTime() - startYoungGCTime; long fullGC = getFullGC() - startFullGC; Result result = new Result(); result.setName(benchmarkCase.getName()); result.setMillis(time); result.setYoungGC(youngGC); result.setYoungGCTime(youngGCTime); result.setFullGC(fullGC); result.setError(error); return result; } public long getYoungGC() { try { // java.lang:type=GarbageCollector,name=G1 Young Generation // java.lang:type=GarbageCollector,name=G1 Old Generation MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName objectName; if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=ParNew"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=ParNew"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=Copy"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=Copy"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation"); } else { objectName = new ObjectName("java.lang:type=GarbageCollector,name=PS Scavenge"); } return (Long) mbeanServer.getAttribute(objectName, "CollectionCount"); } catch (Exception e) { throw new RuntimeException("error"); } } public long getYoungGCTime() { try { MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName objectName; if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=ParNew"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=ParNew"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=Copy"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=Copy"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation"); } else { objectName = new ObjectName("java.lang:type=GarbageCollector,name=PS Scavenge"); } return (Long) mbeanServer.getAttribute(objectName, "CollectionTime"); } catch (Exception e) { throw new RuntimeException("error", e); } } public long getFullGC() { try { MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName objectName; if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=MarkSweepCompact"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=MarkSweepCompact"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=G1 Old Generation"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=G1 Old Generation"); } else { objectName = new ObjectName("java.lang:type=GarbageCollector,name=PS MarkSweep"); } return (Long) mbeanServer.getAttribute(objectName, "CollectionCount"); } catch (Exception e) { throw new RuntimeException("error"); } } public static class Result { private String name; private long millis; private long youngGC; private long youngGCTime; private long fullGC; private Throwable error; public String getName() { return name; } public void setName(String name) { this.name = name; } public long getMillis() { return millis; } public void setMillis(long millis) { this.millis = millis; } public long getYoungGC() { return youngGC; } public void setYoungGC(long youngGC) { this.youngGC = youngGC; } public long getYoungGCTime() { return youngGCTime; } public void setYoungGCTime(long youngGCTime) { this.youngGCTime = youngGCTime; } public long getFullGC() { return fullGC; } public void setFullGC(long fullGC) { this.fullGC = fullGC; } public Throwable getError() { return error; } public void setError(Throwable error) { this.error = error; } } }