Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions performance/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -270,8 +270,7 @@
<validation-api.version>2.0.2.Final</validation-api.version>
<beanvalidation-impl.name>Hibernate Validator</beanvalidation-impl.name>
<beanvalidation-impl.version>6.2.5.Final</beanvalidation-impl.version>
<sources.to.add.main>${project.basedir}/src/main/javax</sources.to.add.main>
<sources.to.add.additional>${project.basedir}/src/main/javax-bv2</sources.to.add.additional>
<sources.to.add.main>${project.basedir}/src/main/javax-bv2</sources.to.add.main>
<sources.to.add.additional.predefined>${project.basedir}/src/main/javax-predefined-scope</sources.to.add.additional.predefined>
</properties>
<dependencies>
Expand Down Expand Up @@ -308,8 +307,7 @@
<validation-api.version>2.0.1.Final</validation-api.version>
<beanvalidation-impl.name>Hibernate Validator</beanvalidation-impl.name>
<beanvalidation-impl.version>6.1.7.Final</beanvalidation-impl.version>
<sources.to.add.main>${project.basedir}/src/main/javax</sources.to.add.main>
<sources.to.add.additional>${project.basedir}/src/main/javax-bv2</sources.to.add.additional>
<sources.to.add.main>${project.basedir}/src/main/javax-bv2</sources.to.add.main>
</properties>
<dependencies>
<dependency>
Expand Down Expand Up @@ -345,8 +343,7 @@
<validation-api.version>2.0.1.Final</validation-api.version>
<beanvalidation-impl.name>Hibernate Validator</beanvalidation-impl.name>
<beanvalidation-impl.version>6.0.23.Final</beanvalidation-impl.version>
<sources.to.add.main>${project.basedir}/src/main/javax</sources.to.add.main>
<sources.to.add.additional>${project.basedir}/src/main/javax-bv2</sources.to.add.additional>
<sources.to.add.main>${project.basedir}/src/main/javax-bv2</sources.to.add.main>
</properties>
<dependencies>
<dependency>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,18 +56,39 @@ public User(String name, String email, int age) {
}
}

private static class UserNoInterpolation {
@NotNull(message = "must be not null")
@Size(min = 3, max = 50, message = "size must be between 3 and 50")
private String name;

@Size(min = 3, max = 50, message = "size must be between 3 and 50")
@NotNull(message = "must be not null")
private String email;

@Min(value = 20, message = "must be at least 20")
private int age;

public UserNoInterpolation(String name, String email, int age) {
this.name = name;
this.email = email;
this.age = age;
}
}

@State(Scope.Benchmark)
public static class BenchmarkState {
Validator validator;
User validUser;
User invalidUser;
UserNoInterpolation invalidUserNoInterpolation;

@Setup
public void setup() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
this.validator = factory.getValidator();
this.validUser = new User( "John Doe", "[email protected]", 25 );
this.invalidUser = new User( "Jo", "invalid-email", 19 );
this.invalidUserNoInterpolation = new UserNoInterpolation( "Jo", "invalid-email", 19 );
}
}

Expand All @@ -82,4 +103,10 @@ public void invalidObjectValidation(BenchmarkState state, Blackhole blackhole) {
Set<ConstraintViolation<User>> violations = state.validator.validate( state.invalidUser );
blackhole.consume( violations );
}

@Benchmark
public void invalidObjectNoInterpolationValidation(BenchmarkState state, Blackhole blackhole) {
Set<ConstraintViolation<UserNoInterpolation>> violations = state.validator.validate( state.invalidUserNoInterpolation );
blackhole.consume( violations );
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.validator.performance.cascaded;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import javax.validation.ConstraintViolation;
import javax.validation.Valid;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.NotNull;

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.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;

/**
* @author Hardy Ferentschik
*/
public class CascadedValidation {

@State(Scope.Benchmark)
public static class CascadedValidationState {
public volatile Validator validator;
public volatile Person person;

public CascadedValidationState() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();

// TODO graphs needs to be generated and deeper
Person kermit = new Person( "kermit" );
Person piggy = new Person( "miss piggy" );
Person gonzo = new Person( "gonzo" );

kermit.addFriend( piggy ).addFriend( gonzo );
piggy.addFriend( kermit ).addFriend( gonzo );
gonzo.addFriend( kermit ).addFriend( piggy );

person = kermit;
}
}

@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Fork(value = 1)
@Threads(50)
@Warmup(iterations = 10)
@Measurement(iterations = 20)
public void testCascadedValidation(CascadedValidationState state, Blackhole bh) {
Set<ConstraintViolation<Person>> violations = state.validator.validate( state.person );
assertThat( violations ).hasSize( 0 );

bh.consume( violations );
}

public static class Person {
@NotNull
String name;

Set<@Valid Person> friends = new HashSet<>();

public Person(String name) {
this.name = name;
}

public Person addFriend(Person friend) {
friends.add( friend );
return this;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.validator.performance.cascaded;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import javax.validation.ConstraintViolation;
import javax.validation.Valid;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.NotNull;
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.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;

public class CascadedWithLotsOfItemsAndCyclesValidation {

private static final int NUMBER_OF_ARTICLES_PER_SHOP = 2000;

@State(Scope.Benchmark)
public static class CascadedWithLotsOfItemsValidationState {
public volatile Validator validator;

public volatile Shop shop;

public CascadedWithLotsOfItemsValidationState() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();

shop = createShop();
}

private Shop createShop() {
Shop shop = new Shop( 1 );

for ( int i = 0; i < NUMBER_OF_ARTICLES_PER_SHOP; i++ ) {
shop.addArticle( new Article( i ) );
}

return shop;
}
}

@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Fork(value = 1)
@Threads(20)
@Warmup(iterations = 10)
@Measurement(iterations = 20)
public void testCascadedValidationWithLotsOfItems(CascadedWithLotsOfItemsValidationState state, Blackhole bh) {
Set<ConstraintViolation<Shop>> violations = state.validator.validate( state.shop );
assertThat( violations ).hasSize( 0 );

bh.consume( violations );
}

public static class Shop {
@NotNull
private Integer id;

@NotNull
private List<@Valid @NotNull Article> articles = new ArrayList<>();

public Shop(Integer id) {
this.id = id;
}

public void addArticle(Article article) {
articles.add( article );
article.shops.add( this );
}
}

public static class Article {
@NotNull
private Integer id;

private Set<@Valid Shop> shops = new HashSet<>();

public Article(Integer id) {
this.id = id;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.validator.performance.cascaded;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import javax.validation.ConstraintViolation;
import javax.validation.Valid;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

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.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;

/**
* @author Guillaume Smet
*/
public class CascadedWithLotsOfItemsAndMoreConstraintsValidation {

private static final int NUMBER_OF_ARTICLES_PER_SHOP = 2000;

@State(Scope.Benchmark)
public static class CascadedWithLotsOfItemsValidationState {
public volatile Validator validator;

public volatile Shop shop;

public CascadedWithLotsOfItemsValidationState() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();

shop = createShop();
}

private Shop createShop() {
Shop shop = new Shop( 1, "Shop" );

for ( int i = 0; i < NUMBER_OF_ARTICLES_PER_SHOP; i++ ) {
shop.addArticle( new Article( i, "Article " + i ) );
}

return shop;
}
}

@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Fork(value = 1)
@Threads(20)
@Warmup(iterations = 10)
@Measurement(iterations = 20)
public void testCascadedValidationWithLotsOfItems(CascadedWithLotsOfItemsValidationState state, Blackhole bh) {
Set<ConstraintViolation<Shop>> violations = state.validator.validate( state.shop );
assertThat( violations ).hasSize( 0 );

bh.consume( violations );
}

public static class Shop {
@NotNull
private Integer id;

@Size(min = 1)
private String name;

@NotNull
private List<@Valid @NotNull Article> articles = new ArrayList<>();

public Shop(Integer id, String name) {
this.id = id;
this.name = name;
}

public void addArticle(Article article) {
articles.add( article );
}
}

public static class Article {
@NotNull
private Integer id;

@Size(min = 1)
private String name;

public Article(Integer id, String name) {
this.id = id;
this.name = name;
}
}
}
Loading
Loading