View Javadoc
1   /*
2    * Copyright 2007 Kasper B. Graversen
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.supercsv.benchmark;
17  
18  import static org.junit.Assert.assertEquals;
19  import static org.junit.Assert.assertNotNull;
20  
21  import java.io.Reader;
22  import java.util.List;
23  import java.util.Map;
24  
25  import org.supercsv.cellprocessor.ift.CellProcessor;
26  import org.supercsv.io.CsvBeanReader;
27  import org.supercsv.io.CsvListReader;
28  import org.supercsv.io.CsvMapReader;
29  import org.supercsv.io.ICsvBeanReader;
30  import org.supercsv.io.ICsvListReader;
31  import org.supercsv.io.ICsvMapReader;
32  import org.supercsv.io.dozer.CsvDozerBeanReader;
33  import org.supercsv.io.dozer.ICsvDozerBeanReader;
34  import org.supercsv.prefs.CsvPreference;
35  
36  import com.carrotsearch.junitbenchmarks.AbstractBenchmark;
37  
38  /**
39   * Provides methods to benchmark all of Super CSV's readers.
40   * <p>
41   * The benchmarks use JUnitBenchmarks
42   * (http://labs.carrotsearch.com/junit-benchmarks-tutorial.html). As shown on
43   * the website, you can generate a Google charts graph from the results.
44   * <p>
45   * The tests contain assertions on the values returned to ensure that the code
46   * is not optimized away.
47   * 
48   * @author James Bassett
49   */
50  public abstract class AbstractCsvReadingBenchmark extends AbstractBenchmark {
51  
52  	/**
53  	 * Times CsvListReader.
54  	 * 
55  	 * @param reader
56  	 *            the CSV reader
57  	 * @param preference
58  	 *            the preferences
59  	 * @param rows
60  	 *            the number of rows to read
61  	 * @throws Exception
62  	 */
63  	public void timeCsvListReader(final Reader reader,
64  			final CsvPreference preference, final int rows) throws Exception {
65  
66  		ICsvListReader listReader = null;
67  		try {
68  			listReader = new CsvListReader(reader, preference);
69  
70  			final String[] header = listReader.getHeader(true);
71  			assertNotNull(header);
72  
73  			for (int j = 0; j < rows; j++) {
74  				final List<String> row = listReader.read();
75  				assertNotNull(row);
76  			}
77  
78  			assertEquals(rows + 1, listReader.getRowNumber());
79  
80  		} finally {
81  			listReader.close();
82  
83  		}
84  
85  	}
86  
87  	/**
88  	 * Times CsvListReader using processors.
89  	 * 
90  	 * @param reader
91  	 *            the CSV reader
92  	 * @param preference
93  	 *            the preferences
94  	 * @param processors
95  	 *            the cell processors
96  	 * @param rows
97  	 *            the number of rows to read
98  	 * @throws Exception
99  	 */
100 	public void timeCsvListReaderUsingProcessors(final Reader reader,
101 			final CsvPreference preference, final CellProcessor[] processors,
102 			final int rows) throws Exception {
103 
104 		ICsvListReader listReader = null;
105 		try {
106 			listReader = new CsvListReader(reader, preference);
107 
108 			final String[] header = listReader.getHeader(true);
109 			assertNotNull(header);
110 
111 			for (int j = 0; j < rows; j++) {
112 				final List<Object> row = listReader.read(processors);
113 				assertNotNull(row);
114 			}
115 
116 			assertEquals(rows + 1, listReader.getRowNumber());
117 
118 		} finally {
119 			listReader.close();
120 		}
121 	}
122 
123 	/**
124 	 * Times CsvMapReader.
125 	 * 
126 	 * @param reader
127 	 *            the CSV reader
128 	 * @param preference
129 	 *            the preferences
130 	 * @param rows
131 	 *            the number of rows to read
132 	 * @throws Exception
133 	 */
134 	public void timeCsvMapReader(final Reader reader,
135 			final CsvPreference preference, final int rows) throws Exception {
136 
137 		ICsvMapReader mapReader = null;
138 		try {
139 			mapReader = new CsvMapReader(reader, preference);
140 
141 			final String[] header = mapReader.getHeader(true);
142 			assertNotNull(header);
143 
144 			for (int j = 0; j < rows; j++) {
145 				final Map<String, String> row = mapReader.read(header);
146 				assertNotNull(row);
147 			}
148 
149 			assertEquals(rows + 1, mapReader.getRowNumber());
150 
151 		} finally {
152 			mapReader.close();
153 		}
154 	}
155 
156 	/**
157 	 * Times CsvMapReader using processors.
158 	 * 
159 	 * @param reader
160 	 *            the CSV reader
161 	 * @param preference
162 	 *            the preferences
163 	 * @param processors
164 	 *            the cell processors
165 	 * @param rows
166 	 *            the number of rows to read
167 	 * @throws Exception
168 	 */
169 	public void timeCsvMapReaderUsingProcessors(final Reader reader,
170 			final CsvPreference preference, final CellProcessor[] processors,
171 			final int rows) throws Exception {
172 
173 		ICsvMapReader mapReader = null;
174 		try {
175 			mapReader = new CsvMapReader(reader, preference);
176 
177 			final String[] header = mapReader.getHeader(true);
178 			assertNotNull(header);
179 
180 			for (int j = 0; j < rows; j++) {
181 				final Map<String, Object> row = mapReader.read(header,
182 						processors);
183 				assertNotNull(row);
184 			}
185 
186 			assertEquals(rows + 1, mapReader.getRowNumber());
187 
188 		} finally {
189 			mapReader.close();
190 		}
191 	}
192 
193 	/**
194 	 * Times CsvBeanReader.
195 	 * 
196 	 * @param reader
197 	 *            the CSV reader
198 	 * @param preference
199 	 *            the preferences
200 	 * @param beanClass
201 	 *            the type of the bean class
202 	 * @param rows
203 	 *            the number of rows to read
204 	 * @throws Exception
205 	 */
206 	public void timeCsvBeanReader(final Reader reader,
207 			final CsvPreference preference, final Class<?> beanClass,
208 			final int rows) throws Exception {
209 
210 		ICsvBeanReader beanReader = null;
211 		try {
212 			beanReader = new CsvBeanReader(reader, preference);
213 
214 			final String[] header = beanReader.getHeader(true);
215 			assertNotNull(header);
216 
217 			for (int j = 0; j < rows; j++) {
218 				final Object bean = beanReader.read(beanClass, header);
219 				assertNotNull(bean);
220 			}
221 
222 			assertEquals(rows + 1, beanReader.getRowNumber());
223 
224 		} finally {
225 			beanReader.close();
226 		}
227 	}
228 
229 	/**
230 	 * Times CsvBeanReader using processors.
231 	 * 
232 	 * @param reader
233 	 *            the CSV reader
234 	 * @param preference
235 	 *            the preferences
236 	 * @param beanClass
237 	 *            the type of the bean class
238 	 * @param processors
239 	 *            the cell processors
240 	 * @param rows
241 	 *            the number of rows to read
242 	 * @throws Exception
243 	 */
244 	public void timeCsvBeanReaderUsingProcessors(final Reader reader,
245 			final CsvPreference preference, final Class<?> beanClass,
246 			final CellProcessor[] processors, final int rows) throws Exception {
247 
248 		ICsvBeanReader beanReader = null;
249 		try {
250 			beanReader = new CsvBeanReader(reader, preference);
251 
252 			String[] header = beanReader.getHeader(true);
253 			assertNotNull(header);
254 
255 			for (int j = 0; j < rows; j++) {
256 				final Object bean = beanReader.read(beanClass, header,
257 						processors);
258 				assertNotNull(bean);
259 			}
260 
261 			assertEquals(rows + 1, beanReader.getRowNumber());
262 
263 		} finally {
264 			beanReader.close();
265 		}
266 	}
267 
268 	/**
269 	 * Times CsvDozerBeanReader.
270 	 * 
271 	 * @param reader
272 	 *            the CSV reader
273 	 * @param preference
274 	 *            the preferences
275 	 * @param beanClass
276 	 *            the type of the bean class
277 	 * @param rows
278 	 *            the number of rows to read
279 	 * @throws Exception
280 	 */
281 	public void timeCsvDozerBeanReader(final Reader reader,
282 			final CsvPreference preference, final Class<?> beanClass,
283 			final int rows) throws Exception {
284 
285 		ICsvDozerBeanReader dozerBeanReader = null;
286 		try {
287 			dozerBeanReader = new CsvDozerBeanReader(reader, preference);
288 
289 			final String[] header = dozerBeanReader.getHeader(true);
290 			assertNotNull(header);
291 
292 			dozerBeanReader.configureBeanMapping(beanClass, header);
293 
294 			for (int j = 0; j < rows; j++) {
295 				final Object bean = dozerBeanReader.read(beanClass);
296 				assertNotNull(bean);
297 			}
298 
299 			assertEquals(rows + 1, dozerBeanReader.getRowNumber());
300 
301 		} finally {
302 			dozerBeanReader.close();
303 		}
304 	}
305 
306 	/**
307 	 * Times CsvDozerBeanReader using processors.
308 	 * 
309 	 * @param reader
310 	 *            the CSV reader
311 	 * @param preference
312 	 *            the preferences
313 	 * @param beanClass
314 	 *            the type of the bean class
315 	 * @param processors
316 	 *            the cell processors
317 	 * @param rows
318 	 *            the number of rows to read
319 	 * @throws Exception
320 	 */
321 	public void timeCsvDozerBeanReaderUsingProcessors(final Reader reader,
322 			final CsvPreference preference, final Class<?> beanClass,
323 			final CellProcessor[] processors, final int rows) throws Exception {
324 
325 		ICsvDozerBeanReader dozerBeanReader = null;
326 		try {
327 			dozerBeanReader = new CsvDozerBeanReader(reader, preference);
328 
329 			final String[] header = dozerBeanReader.getHeader(true);
330 			assertNotNull(header);
331 
332 			dozerBeanReader.configureBeanMapping(beanClass, header);
333 
334 			for (int j = 0; j < rows; j++) {
335 				final Object bean = dozerBeanReader.read(beanClass, processors);
336 				assertNotNull(bean);
337 			}
338 
339 			assertEquals(rows + 1, dozerBeanReader.getRowNumber());
340 
341 		} finally {
342 			dozerBeanReader.close();
343 		}
344 	}
345 
346 }