001 package org.shiftone.jrat.core.jmx.benchmark;
002
003
004 import org.shiftone.jrat.core.HandlerFactory;
005 import org.shiftone.jrat.core.spi.MethodHandler;
006 import org.shiftone.jrat.util.log.Logger;
007 import org.shiftone.jrat.util.time.Clock;
008
009
010 /**
011 * @author jeff@shiftone.org (Jeff Drost)
012 */
013 public class Benchmark implements BenchmarkMBean {
014
015 private static final Logger LOG = Logger.getLogger(Benchmark.class);
016 private MethodHandler methodHandler;
017 private long iterations = 1000000;
018
019 private void doWork() {
020 ;
021 }
022
023
024 public void monitorDoWork() {
025
026 methodHandler.onMethodStart(this);
027
028 long start = Clock.currentTimeMillis();
029
030 doWork();
031 methodHandler.onMethodFinish(this, Clock.currentTimeMillis() - start, null);
032 }
033
034
035 public long getIterations() {
036 return iterations;
037 }
038
039
040 public void setIterations(long iterations) {
041 this.iterations = iterations;
042 }
043
044
045 public String calculateCostPerMethodCallNanosText() {
046 return "JRat is adding an overhead of about " + calculateCostPerMethodCallNanos()
047 + " nanoseconds to each instrumented method call.";
048 }
049
050
051 public double calculateCostPerMethodCallNanos() {
052
053 methodHandler = HandlerFactory.getMethodHandler(Benchmark.class, "doWork", "()V");
054
055 long start;
056
057 start = Clock.currentTimeMillis();
058
059 for (int i = 0; i < iterations; i++) {
060 doWork();
061 }
062
063 long raw = Clock.currentTimeMillis() - start;
064
065 start = Clock.currentTimeMillis();
066
067 for (int i = 0; i < iterations; i++) {
068 monitorDoWork();
069 }
070
071 long jrat = Clock.currentTimeMillis() - start;
072 long delta = jrat - raw;
073 double each = (double) delta / (double) iterations;
074
075 LOG.info("overhead = " + each + " nanoseconds");
076
077 return each;
078 }
079 }