View Javadoc

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   * &#064;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 }