blob: 0092be735c95f3e16ab7c9425c53f58787821e44 [file] [log] [blame]
/*
* 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.bval.jsr;
import org.apache.bval.jsr.example.Author;
import org.apache.bval.jsr.example.Book;
import org.apache.bval.jsr.example.First;
import org.apache.bval.jsr.example.Second;
import org.hibernate.validator.HibernateValidator;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.profile.JavaFlightRecorderProfiler;
import org.openjdk.jmh.profile.Profiler;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.openjdk.jmh.runner.options.TimeValue;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Set;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@State(Scope.Benchmark)
public class Jsr303Benchmark {
private final ValidatorFactory bvalFactory =
Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory();
private final Validator bvalValidator = bvalFactory.getValidator();
private final ValidatorFactory hibernateFactory =
Validation.byProvider(HibernateValidator.class).configure().buildValidatorFactory();
private final Validator hibernateValidator = hibernateFactory.getValidator();
public static void main(String[] args) throws RunnerException {
final Options opt = new OptionsBuilder()
.include(Jsr303Benchmark.class.getSimpleName())
.forks(1)
.threads(5)
.measurementIterations(1)
.measurementTime(TimeValue.seconds(20))
.warmupIterations(2)
.warmupTime(TimeValue.seconds(5))
.addProfiler(JavaFlightRecorderProfiler.class)
.build();
new Runner(opt).run();
}
@Benchmark
public void bvalNoConstraints() {
final Set<ConstraintViolation<BookNoConstraints>> constraintViolations =
bvalFactory.getValidator().validate(new BookNoConstraints());
assertFalse(constraintViolations.iterator().hasNext());
}
@Benchmark
public void bvalNoConstraintsReuseValidator() {
final Set<ConstraintViolation<BookNoConstraints>> constraintViolations =
bvalValidator.validate(new BookNoConstraints());
assertFalse(constraintViolations.iterator().hasNext());
}
@Benchmark
public void bvalConstraintsSuccess() {
final Set<ConstraintViolation<BookSimple>> constraintViolations = bvalFactory.getValidator()
.validate(new BookSimple("Hello",
"Awesome validation",
3,
76));
assertFalse(constraintViolations.iterator().hasNext());
}
@Benchmark
public void bvalConstraintsSuccessReuseValidator() {
final Set<ConstraintViolation<BookSimple>> constraintViolations = bvalValidator
.validate(new BookSimple("Hello",
"Awesome validation",
3,
76));
assertFalse(constraintViolations.iterator().hasNext());
}
@Benchmark
public void bvalConstraintsFailure() {
final Set<ConstraintViolation<Book>> constraintViolations = bvalFactory.getValidator().validate(new Book());
assertTrue(constraintViolations.iterator().hasNext());
}
@Benchmark
public void bvalConstraintsFailureReuseValidator() {
final Set<ConstraintViolation<Book>> constraintViolations = bvalValidator.validate(new Book());
assertTrue(constraintViolations.iterator().hasNext());
}
@Benchmark
public void hibernateNoConstraints() {
final Set<ConstraintViolation<BookNoConstraints>> constraintViolations =
hibernateFactory.getValidator().validate(new BookNoConstraints());
assertFalse(constraintViolations.iterator().hasNext());
}
@Benchmark
public void hibernateNoConstraintsReuseValidator() {
final Set<ConstraintViolation<BookNoConstraints>> constraintViolations =
hibernateValidator.validate(new BookNoConstraints());
assertFalse(constraintViolations.iterator().hasNext());
}
@Benchmark
public void hibernateConstraintsSuccess() {
final Set<ConstraintViolation<BookSimple>> constraintViolations = hibernateFactory.getValidator()
.validate(
new BookSimple("Hello",
"Awesome" +
" validation",
3,
76));
assertFalse(constraintViolations.iterator().hasNext());
}
@Benchmark
public void hibernateConstraintsSuccessReuseValidator() {
final Set<ConstraintViolation<BookSimple>> constraintViolations = hibernateValidator
.validate(
new BookSimple("Hello",
"Awesome" +
" validation",
3,
76));
assertFalse(constraintViolations.iterator().hasNext());
}
@Benchmark
public void hibernateConstraintsFailure() {
final Set<ConstraintViolation<Book>> constraintViolations =
hibernateFactory.getValidator().validate(new Book());
assertTrue(constraintViolations.iterator().hasNext());
}
@Benchmark
public void hibernateConstraintsFailureReuseValidator() {
final Set<ConstraintViolation<Book>> constraintViolations =
hibernateValidator.validate(new Book());
assertTrue(constraintViolations.iterator().hasNext());
}
public static class BookNoConstraints {
private String title;
private String subtitle;
private Author author;
private int uselessField;
private int unconstraintField;
public String getTitle() {
return title;
}
public void setTitle(final String title) {
this.title = title;
}
public String getSubtitle() {
return subtitle;
}
public void setSubtitle(final String subtitle) {
this.subtitle = subtitle;
}
public Author getAuthor() {
return author;
}
public void setAuthor(final Author author) {
this.author = author;
}
public int getUselessField() {
return uselessField;
}
public void setUselessField(final int uselessField) {
this.uselessField = uselessField;
}
public int getUnconstraintField() {
return unconstraintField;
}
public void setUnconstraintField(final int unconstraintField) {
this.unconstraintField = unconstraintField;
}
}
public static class BookSimple {
@NotEmpty(groups = First.class)
private String title;
@Size(max = 30, groups = Second.class)
private String subtitle;
@NotNull
private int uselessField;
private int unconstraintField;
public BookSimple(
final String title,
final String subtitle,
final int uselessField,
final int unconstraintField) {
this.title = title;
this.subtitle = subtitle;
this.uselessField = uselessField;
this.unconstraintField = unconstraintField;
}
public String getTitle() {
return title;
}
public void setTitle(final String title) {
this.title = title;
}
public String getSubtitle() {
return subtitle;
}
public void setSubtitle(final String subtitle) {
this.subtitle = subtitle;
}
public int getUselessField() {
return uselessField;
}
public void setUselessField(final int uselessField) {
this.uselessField = uselessField;
}
public int getUnconstraintField() {
return unconstraintField;
}
public void setUnconstraintField(final int unconstraintField) {
this.unconstraintField = unconstraintField;
}
}
}