View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.beanutils2;
19  
20  import java.util.HashMap;
21  import java.util.Iterator;
22  import java.util.Map;
23  
24  import org.junit.jupiter.api.AfterEach;
25  import org.junit.jupiter.api.BeforeEach;
26  import org.junit.jupiter.api.Test;
27  
28  /**
29   * JUnit Test Case containing microbenchmarks for BeanUtils.
30   */
31  public class BeanUtilsBenchCase {
32  
33      // Basic loop counter
34      private long counter = 100000;
35  
36      // DynaClass for inDyna and outDyna
37      private DynaClass dynaClass;
38  
39      // Input objects that have identical sets of properties and values.
40      private BenchBean inBean;
41      private DynaBean inDyna;
42      private Map<String, Object> inMap; // Map of Objects requiring no conversion
43      private Map<String, String> inStrs; // Map of Strings requiring conversion
44  
45      // Output objects that have identical sets of properties.
46      private BenchBean outBean;
47      private DynaBean outDyna;
48  
49      // BeanUtilsBean instance to be used
50      private BeanUtilsBean bu;
51  
52      /**
53       * Sets up instance variables required by this test case.
54       */
55      @BeforeEach
56      public void setUp() throws Exception {
57  
58          // Set up loop counter (if property specified)
59          final String prop = System.getProperty("counter");
60          if (prop != null) {
61              counter = Long.parseLong(prop);
62          }
63  
64          // Set up DynaClass for our DynaBean instances
65          dynaClass = new BasicDynaClass("BenchDynaClass", null,
66                  new DynaProperty[] { new DynaProperty("booleanProperty", Boolean.TYPE), new DynaProperty("byteProperty", Byte.TYPE),
67                          new DynaProperty("doubleProperty", Double.TYPE), new DynaProperty("floatProperty", Float.TYPE),
68                          new DynaProperty("intProperty", Integer.TYPE), new DynaProperty("longProperty", Long.TYPE),
69                          new DynaProperty("shortProperty", Short.TYPE), new DynaProperty("stringProperty", String.class), });
70  
71          // Create input instances
72          inBean = new BenchBean();
73          inMap = new HashMap<>();
74          inMap.put("booleanProperty", Boolean.valueOf(inBean.getBooleanProperty()));
75          inMap.put("byteProperty", Byte.valueOf(inBean.getByteProperty()));
76          inMap.put("doubleProperty", Double.valueOf(inBean.getDoubleProperty()));
77          inMap.put("floatProperty", Float.valueOf(inBean.getFloatProperty()));
78          inMap.put("intProperty", Integer.valueOf(inBean.getIntProperty()));
79          inMap.put("longProperty", Long.valueOf(inBean.getLongProperty()));
80          inMap.put("shortProperty", Short.valueOf(inBean.getShortProperty()));
81          inMap.put("stringProperty", inBean.getStringProperty());
82          inDyna = dynaClass.newInstance();
83          Iterator<String> inKeys = inMap.keySet().iterator();
84          while (inKeys.hasNext()) {
85              final String inKey = inKeys.next();
86              inDyna.set(inKey, inMap.get(inKey));
87          }
88          inStrs = new HashMap<>();
89          inKeys = inMap.keySet().iterator();
90          while (inKeys.hasNext()) {
91              final String inKey = inKeys.next();
92              inStrs.put(inKey, inMap.get(inKey).toString());
93          }
94  
95          // Create output instances
96          outBean = new BenchBean();
97          outDyna = dynaClass.newInstance();
98          for (final String outKey : inMap.keySet()) {
99              outDyna.set(outKey, inMap.get(outKey));
100         }
101 
102         // Set up BeanUtilsBean instance we will use
103         bu = BeanUtilsBean.getInstance();
104 
105     }
106 
107     /**
108      * Tear down instance variables required by this test case.
109      */
110     @AfterEach
111     public void tearDown() {
112         dynaClass = null;
113         inBean = null;
114         inDyna = null;
115         inMap = null;
116         outBean = null;
117         outDyna = null;
118         bu = null;
119     }
120 
121     // Time copyProperties() from a bean
122     @Test
123     public void testCopyPropertiesBean() throws Exception {
124 
125         long startMillis;
126         long stopMillis;
127 
128         // Bean->Bean
129         for (long i = 0; i < counter; i++) {
130             bu.copyProperties(outBean, inBean);
131         }
132         startMillis = System.currentTimeMillis();
133         for (long i = 0; i < counter; i++) {
134             bu.copyProperties(outBean, inBean);
135         }
136         stopMillis = System.currentTimeMillis();
137         System.err.println("BU.copyProperties(bean,bean), count=" + counter + ", time=" + (stopMillis - startMillis));
138 
139         // Bean->Dyna
140         for (long i = 0; i < counter; i++) {
141             bu.copyProperties(outDyna, inBean);
142         }
143         startMillis = System.currentTimeMillis();
144         for (long i = 0; i < counter; i++) {
145             bu.copyProperties(outDyna, inBean);
146         }
147         stopMillis = System.currentTimeMillis();
148         System.err.println("BU.copyProperties(dyna,bean), count=" + counter + ", time=" + (stopMillis - startMillis));
149 
150     }
151 
152     // Time copyProperties() from a DynaBean
153     @Test
154     public void testCopyPropertiesDyna() throws Exception {
155 
156         long startMillis;
157         long stopMillis;
158 
159         // Dyna->Bean
160         for (long i = 0; i < counter; i++) {
161             bu.copyProperties(outBean, inDyna);
162         }
163         startMillis = System.currentTimeMillis();
164         for (long i = 0; i < counter; i++) {
165             bu.copyProperties(outBean, inDyna);
166         }
167         stopMillis = System.currentTimeMillis();
168         System.err.println("BU.copyProperties(bean,dyna), count=" + counter + ", time=" + (stopMillis - startMillis));
169 
170         // Dyna->Dyna
171         for (long i = 0; i < counter; i++) {
172             bu.copyProperties(outDyna, inDyna);
173         }
174         startMillis = System.currentTimeMillis();
175         for (long i = 0; i < counter; i++) {
176             bu.copyProperties(outDyna, inDyna);
177         }
178         stopMillis = System.currentTimeMillis();
179         System.err.println("BU.copyProperties(dyna,dyna), count=" + counter + ", time=" + (stopMillis - startMillis));
180 
181     }
182 
183     // Time copyProperties() from a Map of Objects
184     @Test
185     public void testCopyPropertiesMap() throws Exception {
186 
187         long startMillis;
188         long stopMillis;
189 
190         // Map->Bean
191         for (long i = 0; i < counter; i++) {
192             bu.copyProperties(outBean, inMap);
193         }
194         startMillis = System.currentTimeMillis();
195         for (long i = 0; i < counter; i++) {
196             bu.copyProperties(outBean, inMap);
197         }
198         stopMillis = System.currentTimeMillis();
199         System.err.println("BU.copyProperties(bean, map), count=" + counter + ", time=" + (stopMillis - startMillis));
200 
201         // Map->Dyna
202         for (long i = 0; i < counter; i++) {
203             bu.copyProperties(outDyna, inMap);
204         }
205         startMillis = System.currentTimeMillis();
206         for (long i = 0; i < counter; i++) {
207             bu.copyProperties(outDyna, inMap);
208         }
209         stopMillis = System.currentTimeMillis();
210         System.err.println("BU.copyProperties(dyna, map), count=" + counter + ", time=" + (stopMillis - startMillis));
211 
212     }
213 
214     // Time copyProperties() from a Map of Strings
215     @Test
216     public void testCopyPropertiesStrs() throws Exception {
217 
218         long startMillis;
219         long stopMillis;
220 
221         // Strs->Bean
222         for (long i = 0; i < counter; i++) {
223             bu.copyProperties(outBean, inStrs);
224         }
225         startMillis = System.currentTimeMillis();
226         for (long i = 0; i < counter; i++) {
227             bu.copyProperties(outBean, inStrs);
228         }
229         stopMillis = System.currentTimeMillis();
230         System.err.println("BU.copyProperties(bean,strs), count=" + counter + ", time=" + (stopMillis - startMillis));
231 
232         // Strs->Dyna
233         for (long i = 0; i < counter; i++) {
234             bu.copyProperties(outDyna, inStrs);
235         }
236         startMillis = System.currentTimeMillis();
237         for (long i = 0; i < counter; i++) {
238             bu.copyProperties(outDyna, inStrs);
239         }
240         stopMillis = System.currentTimeMillis();
241         System.err.println("BU.copyProperties(dyna,strs), count=" + counter + ", time=" + (stopMillis - startMillis));
242 
243     }
244 
245     // Time populate() from a Map of Objects
246     @Test
247     public void testPopulateMap() throws Exception {
248 
249         long startMillis;
250         long stop;
251 
252         // Map->Bean
253         for (long i = 0; i < counter; i++) {
254             bu.populate(outBean, inMap);
255         }
256         startMillis = System.currentTimeMillis();
257         for (long i = 0; i < counter; i++) {
258             bu.populate(outBean, inMap);
259         }
260         stop = System.currentTimeMillis();
261         System.err.println("BU.populate(bean, map), count=" + counter + ", time=" + (stop - startMillis));
262 
263         // Map->Dyna
264         for (long i = 0; i < counter; i++) {
265             bu.populate(outDyna, inMap);
266         }
267         startMillis = System.currentTimeMillis();
268         for (long i = 0; i < counter; i++) {
269             bu.populate(outDyna, inMap);
270         }
271         stop = System.currentTimeMillis();
272         System.err.println("BU.populate(dyna, map), count=" + counter + ", time=" + (stop - startMillis));
273 
274     }
275 
276     // Time populate() from a Map of Strings
277     // NOTE - This simulates what Struts does when processing form beans
278     @Test
279     public void testPopulateStrs() throws Exception {
280 
281         long startMillis;
282         long stop;
283 
284         // Strs->Bean
285         for (long i = 0; i < counter; i++) {
286             bu.populate(outBean, inStrs);
287         }
288         startMillis = System.currentTimeMillis();
289         for (long i = 0; i < counter; i++) {
290             bu.populate(outBean, inStrs);
291         }
292         stop = System.currentTimeMillis();
293         System.err.println("BU.populate(bean,strs), count=" + counter + ", time=" + (stop - startMillis));
294 
295         // Strs->Dyna
296         for (long i = 0; i < counter; i++) {
297             bu.populate(outDyna, inStrs);
298         }
299         startMillis = System.currentTimeMillis();
300         for (long i = 0; i < counter; i++) {
301             bu.populate(outDyna, inStrs);
302         }
303         stop = System.currentTimeMillis();
304         System.err.println("BU.populate(dyna,strs), count=" + counter + ", time=" + (stop - startMillis));
305 
306     }
307 
308 }