Author: ebourg
Date: Sun Feb  8 23:47:27 2015
New Revision: 1658276

URL: http://svn.apache.org/r1658276
Log:
Added a JMH benchmark to compare the most commons CSV parsers

Added:
    
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVBenchmark.java 
  (with props)
Modified:
    commons/proper/csv/trunk/pom.xml

Modified: commons/proper/csv/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/csv/trunk/pom.xml?rev=1658276&r1=1658275&r2=1658276&view=diff
==============================================================================
--- commons/proper/csv/trunk/pom.xml (original)
+++ commons/proper/csv/trunk/pom.xml Sun Feb  8 23:47:27 2015
@@ -73,6 +73,12 @@ CSV files of various types.
       <organization>The Apache Software Foundation</organization>
     </developer>
     <developer>
+      <name>Emmanuel Bourg</name>
+      <id>ebourg</id>
+      <email>ebo...@apache.org</email>
+      <organization>Apache</organization>
+    </developer>
+    <developer>
       <name>Gary Gregory</name>
       <id>ggregory</id>
       <email>ggreg...@apache.org</email>
@@ -357,6 +363,112 @@ CSV files of various types.
                 </configuration>
               </execution>
             </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    
+
+    <!-- Profile to build and run the benchmarks. Use 'mvn test -Pbenchmark', 
and add '-Dbenchmark=foo' to run only the foo benchmark -->
+    <profile>
+      <id>benchmark</id>
+      
+      <dependencies>
+        <dependency>
+          <groupId>org.openjdk.jmh</groupId>
+          <artifactId>jmh-core</artifactId>
+          <version>1.5.2</version>
+          <scope>test</scope>
+        </dependency>
+    
+        <dependency>
+          <groupId>org.openjdk.jmh</groupId>
+          <artifactId>jmh-generator-annprocess</artifactId>
+          <version>1.5.2</version>
+          <scope>test</scope>
+        </dependency>
+
+        <dependency>
+          <groupId>genjava</groupId>
+          <artifactId>gj-csv</artifactId>
+          <version>1.0</version>
+          <scope>test</scope>
+        </dependency>
+        
+        <dependency>
+            <groupId>net.sourceforge.javacsv</groupId>
+            <artifactId>javacsv</artifactId>
+            <version>2.0</version>
+          <scope>test</scope>
+        </dependency>
+    
+        <dependency>
+          <groupId>com.opencsv</groupId>
+          <artifactId>opencsv</artifactId>
+          <version>3.1</version>
+          <scope>test</scope>
+        </dependency>
+
+        <dependency>
+          <groupId>net.sf.supercsv</groupId>
+          <artifactId>super-csv</artifactId>
+          <version>2.2.1</version>
+        </dependency>
+
+        <!-- Not in Maven Central, download manually from 
http://kasparov.skife.org/csv/csv-1.0.jar and copy in the base directory -->
+        <dependency>
+          <groupId>org.skife.kasparov</groupId>
+          <artifactId>csv</artifactId>
+          <version>1.0</version>
+          <scope>system</scope>
+          <systemPath>${basedir}/csv-1.0.jar</systemPath>
+        </dependency>
+      </dependencies>
+      
+      <properties>
+        <skipTests>true</skipTests>
+        <benchmark>org.apache</benchmark>
+      </properties>
+      
+      <build>
+        <plugins>
+          <!-- Enable the compilation of the benchmarks -->
+          <plugin>
+            <artifactId>maven-compiler-plugin</artifactId>
+            <configuration combine.self="override">
+              <testIncludes>
+                <testInclude>**/*</testInclude>
+              </testIncludes>
+            </configuration>
+          </plugin>
+          
+          <!-- Hook the benchmarks to the test phase -->
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>exec-maven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>benchmark</id>
+                <phase>test</phase>
+                <goals>
+                  <goal>exec</goal>
+                </goals>
+                <configuration>
+                  <classpathScope>test</classpathScope>
+                  <executable>java</executable>
+                  <arguments>
+                    <argument>-classpath</argument>
+                    <classpath/>
+                    <argument>org.openjdk.jmh.Main</argument>
+                    <argument>-rf</argument>
+                    <argument>json</argument>
+                    <argument>-rff</argument>
+                    <argument>target/jmh-result.json</argument>
+                    <argument>${benchmark}</argument>
+                  </arguments>
+                </configuration>
+              </execution>
+            </executions>
           </plugin>
         </plugins>
       </build>

Added: 
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVBenchmark.java
URL: 
http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVBenchmark.java?rev=1658276&view=auto
==============================================================================
--- 
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVBenchmark.java 
(added)
+++ 
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVBenchmark.java 
Sun Feb  8 23:47:27 2015
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.csv;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import com.generationjava.io.CsvReader;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Threads;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+import org.supercsv.io.CsvListReader;
+import org.supercsv.prefs.CsvPreference;
+
+@BenchmarkMode(Mode.AverageTime)
+@Fork(value = 1, jvmArgs = "-server")
+@Threads(1)
+@Warmup(iterations = 10)
+@Measurement(iterations = 10)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+public class CSVBenchmark {
+
+    private BufferedReader getReader() throws IOException {
+        return new BufferedReader(new FileReader("worldcitiespop.txt"));
+    }
+
+    @Benchmark
+    public int baseline(Blackhole bh) throws Exception {
+        BufferedReader in = getReader();
+        int count = 0;
+        String line;
+        while ((line = in.readLine()) != null) {
+            count++;
+        }
+        
+        bh.consume(count);
+        in.close();
+        return count;
+    }
+
+    @Benchmark
+    public int parseCommonsCSV(Blackhole bh) throws Exception {
+        BufferedReader in = getReader();
+        
+        CSVFormat format = CSVFormat.DEFAULT.withHeader();
+
+        int count = 0;
+        for (CSVRecord record : format.parse(in)) {
+            count++;
+        }
+
+        bh.consume(count);
+        in.close();
+        return count;
+    }
+
+    @Benchmark
+    public int parseGenJavaCSV(Blackhole bh) throws Exception {
+        BufferedReader in = getReader();
+        
+        CsvReader reader = new CsvReader(in);
+        reader.setFieldDelimiter(',');
+
+        int count = 0;
+        String[] record = null;
+        while ((record = reader.readLine()) != null) {
+            count++;
+        }
+
+        bh.consume(count);
+        in.close();
+        return count;
+    }
+
+    @Benchmark
+    public int parseJavaCSV(Blackhole bh) throws Exception {
+        BufferedReader in = getReader();
+        
+        com.csvreader.CsvReader reader = new com.csvreader.CsvReader(in, ',');
+        reader.setRecordDelimiter('\n');
+
+        int count = 0;
+        while (reader.readRecord()) {
+            count++;
+        }
+
+        bh.consume(count);
+        in.close();
+        return count;
+    }
+
+    @Benchmark
+    public int parseOpenCSV(Blackhole bh) throws Exception {
+        BufferedReader in = getReader();
+        
+        com.opencsv.CSVReader reader = new com.opencsv.CSVReader(in, ',');
+
+        int count = 0;
+        while (reader.readNext() != null) {
+            count++;
+        }
+
+        bh.consume(count);
+        in.close();
+        return count;
+    }
+
+    @Benchmark
+    public int parseSkifeCSV(Blackhole bh) throws Exception {
+        BufferedReader in = getReader();
+        
+        org.skife.csv.CSVReader reader = new org.skife.csv.SimpleReader();
+        reader.setSeperator(',');
+        
+        CountingReaderCallback callback = new CountingReaderCallback();
+        reader.parse(in, callback);
+
+        bh.consume(callback);
+        in.close();
+        return callback.count;
+    }
+
+    private static class CountingReaderCallback implements 
org.skife.csv.ReaderCallback {
+        public int count = 0;
+
+        @Override
+        public void onRow(String[] fields) {
+            count++;
+        }
+    }
+
+    @Benchmark
+    public int parseSuperCSV(Blackhole bh) throws Exception {
+        BufferedReader in = getReader();
+        
+        CsvListReader reader = new CsvListReader(in, 
CsvPreference.STANDARD_PREFERENCE);
+
+        int count = 0;
+        List<String> record = null;
+        while ((record = reader.read()) != null) {
+            count++;
+        }
+
+        bh.consume(count);
+        in.close();
+        return count;
+    }
+}

Propchange: 
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVBenchmark.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVBenchmark.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL


Reply via email to