View Javadoc
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          // Writing, ordered
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          // Writing, unordered
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         // Reading, ordered
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         // Reading, ordered
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         // Writing, ordered
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         // Writing, unordered
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         // Reading, ordered
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         // Reading, ordered
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 }