JMH is a tool used during the build. The source code for the product does not depend on it. See http://www.apache.org/legal/resolved.html#prohibited <http://www.apache.org/legal/resolved.html#prohibited>.
Ralph > On Feb 15, 2015, at 2:23 AM, Benedikt Ritter <brit...@apache.org> wrote: > > 2015-02-09 2:40 GMT+01:00 sebb <seb...@gmail.com>: > >> On 8 February 2015 at 23:47, <ebo...@apache.org> wrote: >>> 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 >> >> -1 >> >> This has broken the Continuum build. >> >> Also the JMH website says: >> >> "The recommended way to run a JMH benchmark is to use Maven to setup a >> standalone project that depends on the jar files of your application. >> This approach is preferred to ensure that the benchmarks are correctly >> initialized and produce reliable results. It is possible to run >> benchmarks from within an existing project, and even from within an >> IDE, however setup is more complex and the results are less reliable." >> >> Further, it's not clear to me what the JMH license is. >> It rather looks like GPL. >> > > +1 for this change in general. It's far superior to the manual benchmark we > had before. > > Regarding the problems mentioned by sebb: > > - Is the continuum build fixed already? > - if we add further functionality, we will eventually end up with a multi > module build that has modules like: core, beans, annotations, benchmarks. > For now we should follow KISS and simply add it to the project until > unresolvable problems show up. > - regarding the license issue: since log4j seems to use it, I think we are > on the save side. Maybe someone from the log4j team can comment (ping at > bodewig, ggregory) > > >> >>> 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 >>> >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> For additional commands, e-mail: dev-h...@commons.apache.org >> >> > > > -- > http://people.apache.org/~britter/ > http://www.systemoutprintln.de/ > http://twitter.com/BenediktRitter > http://github.com/britter