1 /** 2 * Copyright (c) 2012, University of Konstanz, Distributed Systems Group 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * * Neither the name of the University of Konstanz nor the 13 * names of its contributors may be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY 20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 package org.perfidix; 28 29 import java.util.HashSet; 30 import java.util.Set; 31 32 import org.perfidix.element.KindOfArrangement; 33 import org.perfidix.meter.AbstractMeter; 34 import org.perfidix.meter.Time; 35 import org.perfidix.meter.TimeMeter; 36 import org.perfidix.ouput.AbstractOutput; 37 38 /** 39 * Configuration for Benchmark. Simple pass this class through the 40 * Perfidix-Class. Each setting is hold over here. This class must be inherited 41 * by a constructor which has no arguments to provide easy instantiation. This 42 * can be done in the following way: 43 * <p> 44 * 45 * <pre> 46 * 47 * @BenchmarkConfig 48 * public class Config extends AbstractConfig { 49 * private final static int RUNS = 100; 50 * private final static AbstractMeter[] METERS = { 51 * new TimeMeter(Time.MilliSeconds), new MemMeter(Memory.Byte) 52 * }; 53 * private final static AbstractOutput[] OUTPUT = { 54 * new TabularSummaryOutput() 55 * }; 56 * private final static KindOfArrangement ARRAN = KindOfArrangement.SequentialMethodArrangement; 57 * private final static double GCPROB = 1.0d; 58 * 59 * public Config() { 60 * super(RUNS, METERS, OUTPUT, ARRAN, GCPROB); 61 * } 62 * } 63 * 64 * </pre> 65 * 66 * </p> 67 * 68 * @author Sebastian Graf, University of Konstanz 69 */ 70 public abstract class AbstractConfig { 71 72 /** Standard runs */ 73 public final static int RUNS = 10; 74 75 /** Standard meters */ 76 public final static Set<AbstractMeter> METERS = new HashSet<AbstractMeter>(); 77 78 /** Standard listeners */ 79 public final static Set<AbstractOutput> LISTENERS = new HashSet<AbstractOutput>(); 80 81 /** Standard arrangement */ 82 public final static KindOfArrangement ARRAN = KindOfArrangement.NoArrangement; 83 84 /** Standard gc-prob */ 85 public final static double GARBAGE_PROB = 1d; 86 87 /** actual value for runs */ 88 private transient final int runs; 89 90 /** actual value for meters */ 91 private transient final AbstractMeter[] meters; 92 93 /** actual value for listeners */ 94 private transient final AbstractOutput[] listeners; 95 96 /** actual value for runs */ 97 private transient final KindOfArrangement arrangement; 98 99 /** actual value for gcProb */ 100 private transient final double gcProb; 101 102 static { 103 METERS.add(new TimeMeter(Time.MilliSeconds)); 104 } 105 106 /** 107 * Simple constructor. 108 */ 109 protected AbstractConfig(final int paramRuns, final Set<AbstractMeter> paramMeters, 110 final Set<AbstractOutput> paramOutput, final KindOfArrangement paramArr, final double paramGC) { 111 runs = paramRuns; 112 113 meters = paramMeters.toArray(new AbstractMeter[paramMeters.size()]); 114 listeners = paramOutput.toArray(new AbstractOutput[paramOutput.size()]); 115 116 arrangement = paramArr; 117 gcProb = paramGC; 118 } 119 120 /** 121 * Getter for member meters 122 * 123 * @return the meters 124 */ 125 public final AbstractMeter[] getMeters() { 126 final AbstractMeter[] returnVal = new AbstractMeter[meters.length]; 127 System.arraycopy(meters, 0, returnVal, 0, returnVal.length); 128 return returnVal; 129 } 130 131 /** 132 * Getter for member runs 133 * 134 * @return the runs 135 */ 136 public final int getRuns() { 137 return runs; 138 } 139 140 /** 141 * Getter for member gcProb 142 * 143 * @return the gcProb 144 */ 145 public final double getGcProb() { 146 return gcProb; 147 } 148 149 /** 150 * Getter for member listeners 151 * 152 * @return the listeners 153 */ 154 public final AbstractOutput[] getListener() { 155 final AbstractOutput[] returnVal = new AbstractOutput[listeners.length]; 156 System.arraycopy(listeners, 0, returnVal, 0, returnVal.length); 157 return returnVal; 158 } 159 160 /** 161 * Getter for member arrangement 162 * 163 * @return the arrangement 164 */ 165 public final KindOfArrangement getArrangement() { 166 return arrangement; 167 } 168 169 /** 170 * Standard config. 171 * 172 * @author Sebastian Graf, University of Konstanz 173 */ 174 public static class StandardConfig extends AbstractConfig { 175 176 /** 177 * Constructor. 178 */ 179 public StandardConfig() { 180 super(RUNS, METERS, LISTENERS, ARRAN, GARBAGE_PROB); 181 } 182 183 } 184 }