package com.alibaba.tamper.performace; import java.lang.management.ManagementFactory; import java.lang.reflect.Method; import java.math.BigDecimal; import java.math.BigInteger; import java.text.DecimalFormat; /** * @author jianghang 2011-6-10 下午04:21:33 */ public class AbstractPerformance { protected static final DecimalFormat integerFormat = new DecimalFormat("#,###"); protected static void testTemplate(TestCallback callback, CopyBean source, int count) { int warmup = 10070; // 先进行预热,加载一些类,避免影响测试 for (int i = 0; i < warmup; i++) { callback.call(source); } restoreJvm(); // 进行GC回收 // 进行测试 long start = System.nanoTime(); for (int i = 0; i < count; i++) { callback.call(source); } long nscost = (System.nanoTime() - start); System.out.println(callback.getName() + " total cost=" + integerFormat.format(nscost) + "ns , each cost=" + nscost / count + "ns"); restoreJvm();// 进行GC回收 } protected static CopyBean getBean() { CopyBean bean = new CopyBean(); bean.setIntValue(1); bean.setBoolValue(false); bean.setFloatValue(1.0f); bean.setDoubleValue(1.0d); bean.setLongValue(1l); bean.setCharValue('a'); bean.setShortValue((short) 1); bean.setByteValue((byte) 1); bean.setIntegerValue(new Integer("1")); bean.setBoolObjValue(new Boolean("false")); bean.setFloatObjValue(new Float("1.0")); bean.setDoubleObjValue(new Double("1.0")); bean.setLongObjValue(new Long("1")); bean.setCharacterValue('a'); bean.setShortObjValue(new Short("1")); bean.setByteObjValue(new Byte("1")); bean.setBigIntegerValue(new BigInteger("1")); bean.setBigDecimalValue(new BigDecimal("1")); bean.setStringValue("1"); return bean; } protected static Method getMethod(String methodName, Class... type) { try { return CopyBean.class.getMethod(methodName, type); } catch (Exception e) { e.printStackTrace(); } return null; } protected static void restoreJvm() { int maxRestoreJvmLoops = 10; long memUsedPrev = memoryUsed(); for (int i = 0; i < maxRestoreJvmLoops; i++) { System.runFinalization(); System.gc(); long memUsedNow = memoryUsed(); // break early if have no more finalization and get constant mem used if ((ManagementFactory.getMemoryMXBean().getObjectPendingFinalizationCount() == 0) && (memUsedNow >= memUsedPrev)) { break; } else { memUsedPrev = memUsedNow; } } } protected static long memoryUsed() { Runtime rt = Runtime.getRuntime(); return rt.totalMemory() - rt.freeMemory(); } } interface TestCallback { String getName(); CopyBean call(CopyBean source); }