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.example.stack;
28
29 import java.util.ArrayDeque;
30 import java.util.Random;
31 import java.util.Stack;
32
33 import org.perfidix.Benchmark;
34 import org.perfidix.annotation.BeforeBenchClass;
35 import org.perfidix.annotation.Bench;
36 import org.perfidix.example.Config;
37 import org.perfidix.ouput.TabularSummaryOutput;
38 import org.perfidix.result.BenchmarkResult;
39
40 /**
41 * Benching {@link FastIntStack} against {@link Stack}. Just a simple example of
42 * Perfidix.
43 *
44 * @author Sebastian Graf, University of Konstanz
45 */
46 public final class StackBenchmark {
47
48 /**
49 * Number of runs.
50 */
51 private static final int RUNS = 100;
52
53 /**
54 * Size of array to be tested.
55 */
56 private static final int ARRAYSIZE = 100;
57
58 /** Data to be written and read. */
59 private transient int[] intData;
60
61 /** FastStack instance. */
62 private transient FastIntStack fastInt;
63
64 /** Stack instance. */
65 private transient Stack<Integer> normalInt;
66
67 private transient ArrayDeque<Integer> arrayDeque;
68
69 /**
70 * Generating the data, just once per runtime.
71 */
72 @BeforeBenchClass
73 public void generateData() {
74 final Random ran = new Random();
75 intData = new int[ARRAYSIZE];
76 int counter = 0;
77 while (counter < ARRAYSIZE) {
78 intData[counter] = ran.nextInt();
79 counter++;
80 }
81 }
82
83 /**
84 * Bench for pushing the data to the {@link FastIntStack}.
85 */
86 @Bench(runs = RUNS)
87 public void benchFastIntPush() {
88 fastInt = new FastIntStack();
89 for (final int i : intData) {
90 fastInt.push(i);
91 }
92 }
93
94 /**
95 * Bench for popping the data from the {@link FastIntStack}.
96 */
97 @Bench(runs = RUNS, beforeEachRun = "benchFastIntPush")
98 public void benchFastIntStackPop() {
99
100 while (fastInt.size() > 0) {
101 fastInt.pop();
102
103 }
104 }
105
106 /**
107 * Bench for pushing the data to the {@link Stack}.
108 */
109 @Bench(runs = RUNS)
110 public void benchNormalIntPush() {
111 normalInt = new Stack<Integer>();
112 for (final int i : intData) {
113 normalInt.push(i);
114 }
115 }
116
117 /**
118 * Bench for popping the data from the {@link Stack}.
119 */
120 @Bench(runs = RUNS, beforeEachRun = "benchNormalIntPush")
121 public void benchNormalIntPop() {
122 while (normalInt.size() > 0) {
123 normalInt.pop();
124 }
125 }
126
127 @Bench(runs = RUNS)
128 /**
129 * Bench for pushing the data to the {@link ArrayDeque}.
130 */
131 public void benchArrayDequePush() {
132 arrayDeque = new ArrayDeque<Integer>();
133 for (final int i : intData) {
134 arrayDeque.push(i);
135 }
136 }
137
138 /**
139 * Bench for popping the data from the {@link ArrayDeque}.
140 */
141 @Bench(runs = RUNS, beforeEachRun = "benchArrayDequePush")
142 public void benchArrayDequeStackPop() {
143
144 while (arrayDeque.size() > 0) {
145 arrayDeque.pop();
146 }
147 }
148
149 /**
150 * Simple setUp of a benchmark. The {@link Benchmark} is initialized with
151 * two Meters (<code>TimeMeter</code> and <code>MemMeter</code>). Afterwards
152 * the benchmark is running with a TabularOutput as a listener registered.
153 * The result of the benchmark is displayed in a complete table at the end.
154 *
155 * @param args
156 * not used here
157 */
158 public static void main(final String[] args) {
159
160 final Benchmark bench = new Benchmark(new Config());
161 bench.add(StackBenchmark.class);
162
163 final BenchmarkResult res = bench.run();
164 new TabularSummaryOutput().visitBenchmark(res);
165 }
166
167 }