1 package com.opencsv.bean;
2
3 import com.opencsv.*;
4 import com.opencsv.bean.mocks.AnnotatedMockBeanFull;
5 import com.opencsv.exceptions.CsvDataTypeMismatchException;
6 import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
7 import org.apache.commons.lang3.time.StopWatch;
8 import org.apache.commons.lang3.tuple.ImmutablePair;
9 import org.junit.jupiter.api.AfterEach;
10 import org.junit.jupiter.api.BeforeAll;
11 import org.junit.jupiter.api.BeforeEach;
12 import org.junit.jupiter.api.Test;
13
14 import java.io.*;
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.Locale;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20
21 public class StatefulBeanToCsvPerformanceTest {
22 private static final String SEPARATOR_LINE = "===============================================================================";
23 private static Locale systemLocale;
24
25 @BeforeAll
26 public static void storeSystemLocale() {
27 systemLocale = Locale.getDefault();
28 }
29
30 @BeforeEach
31 public void setSystemLocaleToValueNotGerman() {
32 Locale.setDefault(Locale.US);
33 }
34
35 @AfterEach
36 public void setSystemLocaleBackToDefault() {
37 Locale.setDefault(systemLocale);
38 }
39
40 @Test
41 public void testPerformance()
42 throws IOException, CsvDataTypeMismatchException,
43 CsvRequiredFieldEmptyException, InterruptedException {
44 performanceWithDefaultWriter(100, false);
45 performanceWithRFC4180Parser(100, false);
46
47 int numBeans = 10000;
48 System.out.println("The following are performance data. Please keep an eye on them as you develop.");
49
50 System.gc();
51 Thread.sleep(2000);
52
53 performanceWithDefaultWriter(numBeans, true);
54
55 System.gc();
56 Thread.sleep(2000);
57
58 performanceWithRFC4180Parser(numBeans, true);
59 }
60
61 private void performanceWithRFC4180Parser(int numBeans, boolean displayData) throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
62 List<AnnotatedMockBeanFull> beanList = new ArrayList<>(numBeans);
63 ImmutablePair<AnnotatedMockBeanFull, AnnotatedMockBeanFull> pair = TestUtils.createTwoGoodBeans();
64 for (int i = 0; i < numBeans / 2; i++) {
65 beanList.add(pair.left);
66 beanList.add(pair.right);
67 }
68
69 RFC4180ParserBuilder parserBuilder = new RFC4180ParserBuilder();
70
71 if (displayData) {
72 System.out.println(SEPARATOR_LINE);
73 System.out.println(" StatefulBeanToCsv with CSVParserWriter and RFC4180Parser.");
74 System.out.println(SEPARATOR_LINE);
75 }
76
77
78 Writer writer = new StringWriter();
79 CSVWriterBuilder writerBuilder = new CSVWriterBuilder(writer);
80 ICSVWriter csvWriter = writerBuilder.withParser(parserBuilder.build()).build();
81
82 HeaderColumnNameMappingStrategy<AnnotatedMockBeanFull> strat = new HeaderColumnNameMappingStrategy<>();
83 strat.setType(AnnotatedMockBeanFull.class);
84 StatefulBeanToCsv<AnnotatedMockBeanFull> btcsv = new StatefulBeanToCsvBuilder<AnnotatedMockBeanFull>(csvWriter)
85 .withMappingStrategy(strat).build();
86 StopWatch watch = StopWatch.createStarted();
87 btcsv.write(beanList);
88 watch.stop();
89 if (displayData) {
90 System.out.println("Time taken to write " + numBeans + " beans, ordered: " + watch);
91 }
92
93
94 writer = new StringWriter();
95 writerBuilder = new CSVWriterBuilder(writer);
96 csvWriter = writerBuilder.withParser(parserBuilder.build()).build();
97
98 strat = new HeaderColumnNameMappingStrategy<>();
99 strat.setType(AnnotatedMockBeanFull.class);
100 btcsv = new StatefulBeanToCsvBuilder<AnnotatedMockBeanFull>(csvWriter)
101 .withMappingStrategy(strat)
102 .withOrderedResults(false)
103 .build();
104 watch = StopWatch.createStarted();
105 btcsv.write(beanList);
106 watch.stop();
107 if (displayData) {
108 System.out.println("Time taken to write " + numBeans + " beans, unordered: " + watch);
109 }
110
111
112 Reader reader = new StringReader(writer.toString());
113 CSVReaderBuilder readerBuilder = new CSVReaderBuilder(reader);
114 CSVReader csvReader = readerBuilder.withCSVParser(parserBuilder.build()).build();
115
116 CsvToBean<AnnotatedMockBeanFull> csvtb = new CsvToBeanBuilder<AnnotatedMockBeanFull>(csvReader)
117 .withType(AnnotatedMockBeanFull.class)
118 .withMappingStrategy(strat).build();
119 watch = StopWatch.createStarted();
120 List<AnnotatedMockBeanFull> beans = csvtb.parse();
121 watch.stop();
122 assertEquals(numBeans, beans.size());
123 if (displayData) {
124 System.out.println("Time taken to read " + numBeans + " beans, ordered: " + watch);
125 }
126
127
128 reader = new StringReader(writer.toString());
129 readerBuilder = new CSVReaderBuilder(reader);
130 csvReader = readerBuilder.withCSVParser(parserBuilder.build()).build();
131
132 csvtb = new CsvToBeanBuilder<AnnotatedMockBeanFull>(csvReader)
133 .withType(AnnotatedMockBeanFull.class)
134 .withOrderedResults(false)
135 .withMappingStrategy(strat).build();
136 watch = StopWatch.createStarted();
137 beans = csvtb.parse();
138 watch.stop();
139 assertEquals(numBeans, beans.size());
140 if (displayData) {
141 System.out.println("Time taken to read " + numBeans + " beans, unordered: " + watch);
142 }
143 }
144
145 private void performanceWithDefaultWriter(int numBeans, boolean displayData) throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
146
147 List<AnnotatedMockBeanFull> beanList = new ArrayList<>(numBeans);
148 ImmutablePair<AnnotatedMockBeanFull, AnnotatedMockBeanFull> pair = TestUtils.createTwoGoodBeans();
149
150 for (int i = 0; i < numBeans / 2; i++) {
151 beanList.add(pair.left);
152 beanList.add(pair.right);
153 }
154
155 if (displayData) {
156 System.out.println(SEPARATOR_LINE);
157 System.out.println(" StatefulBeanToCsv with default reader and writer.");
158 System.out.println(SEPARATOR_LINE);
159 }
160
161
162 Writer writer = new StringWriter();
163 HeaderColumnNameMappingStrategy<AnnotatedMockBeanFull> strat = new HeaderColumnNameMappingStrategy<>();
164 strat.setType(AnnotatedMockBeanFull.class);
165 StatefulBeanToCsv<AnnotatedMockBeanFull> btcsv = new StatefulBeanToCsvBuilder<AnnotatedMockBeanFull>(writer)
166 .withMappingStrategy(strat).build();
167 StopWatch watch = StopWatch.createStarted();
168 btcsv.write(beanList);
169 watch.stop();
170 if (displayData) {
171 System.out.println("Time taken to write " + numBeans + " beans, ordered: " + watch);
172 }
173
174
175 writer = new StringWriter();
176 strat = new HeaderColumnNameMappingStrategy<>();
177 strat.setType(AnnotatedMockBeanFull.class);
178 btcsv = new StatefulBeanToCsvBuilder<AnnotatedMockBeanFull>(writer)
179 .withMappingStrategy(strat)
180 .withOrderedResults(false)
181 .build();
182 watch = StopWatch.createStarted();
183 btcsv.write(beanList);
184 watch.stop();
185 if (displayData) {
186 System.out.println("Time taken to write " + numBeans + " beans, unordered: " + watch);
187 }
188
189
190 Reader reader = new StringReader(writer.toString());
191 CsvToBean<AnnotatedMockBeanFull> csvtb = new CsvToBeanBuilder<AnnotatedMockBeanFull>(reader)
192 .withType(AnnotatedMockBeanFull.class)
193 .withMappingStrategy(strat).build();
194 watch = StopWatch.createStarted();
195 List<AnnotatedMockBeanFull> beans = csvtb.parse();
196 watch.stop();
197 assertEquals(numBeans, beans.size());
198 if (displayData) {
199 System.out.println("Time taken to read " + numBeans + " beans, ordered: " + watch);
200 }
201
202
203 reader = new StringReader(writer.toString());
204 csvtb = new CsvToBeanBuilder<AnnotatedMockBeanFull>(reader)
205 .withType(AnnotatedMockBeanFull.class)
206 .withOrderedResults(false)
207 .withMappingStrategy(strat).build();
208 watch = StopWatch.createStarted();
209 beans = csvtb.parse();
210 watch.stop();
211 assertEquals(numBeans, beans.size());
212 if (displayData) {
213 System.out.println("Time taken to read " + numBeans + " beans, unordered: " + watch);
214 }
215 }
216
217 }