Skip to content

Commit 075d180

Browse files
committed
HV-1831 Add a cascading benchmark with cycles
Signed-off-by: marko-bekhta <[email protected]>
1 parent 28efd75 commit 075d180

8 files changed

+217
-12
lines changed

performance/src/main/jakarta-predefined-scope/org/hibernate/validator/performance/cascaded/PredefinedScopeCascadedValidation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ public static class Person {
8484
@NotNull
8585
String name;
8686

87-
@Valid
88-
Set<Person> friends = new HashSet<>();
87+
88+
Set<@Valid Person> friends = new HashSet<>();
8989

9090
public Person(String name) {
9191
this.name = name;
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.validator.performance.cascaded;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
import java.util.ArrayList;
10+
import java.util.HashSet;
11+
import java.util.List;
12+
import java.util.Set;
13+
import java.util.concurrent.TimeUnit;
14+
15+
import org.hibernate.validator.PredefinedScopeHibernateValidator;
16+
17+
import jakarta.validation.ConstraintViolation;
18+
import jakarta.validation.Valid;
19+
import jakarta.validation.Validation;
20+
import jakarta.validation.Validator;
21+
import jakarta.validation.ValidatorFactory;
22+
import jakarta.validation.constraints.NotNull;
23+
import org.openjdk.jmh.annotations.Benchmark;
24+
import org.openjdk.jmh.annotations.BenchmarkMode;
25+
import org.openjdk.jmh.annotations.Fork;
26+
import org.openjdk.jmh.annotations.Measurement;
27+
import org.openjdk.jmh.annotations.Mode;
28+
import org.openjdk.jmh.annotations.OutputTimeUnit;
29+
import org.openjdk.jmh.annotations.Scope;
30+
import org.openjdk.jmh.annotations.State;
31+
import org.openjdk.jmh.annotations.Threads;
32+
import org.openjdk.jmh.annotations.Warmup;
33+
import org.openjdk.jmh.infra.Blackhole;
34+
35+
public class PredefinedScopeCascadedWithLotsOfItemsAndCyclesValidation {
36+
37+
private static final int NUMBER_OF_ARTICLES_PER_SHOP = 5000;
38+
39+
@State(Scope.Benchmark)
40+
public static class CascadedWithLotsOfItemsValidationState {
41+
public volatile Validator validator;
42+
43+
public volatile Shop shop;
44+
45+
public CascadedWithLotsOfItemsValidationState() {
46+
ValidatorFactory factory = Validation.byProvider( PredefinedScopeHibernateValidator.class )
47+
.configure()
48+
.builtinConstraints( Set.of( NotNull.class.getName() ) )
49+
.initializeBeanMetaData( Set.of( Shop.class, Article.class ) )
50+
.buildValidatorFactory();
51+
validator = factory.getValidator();
52+
53+
shop = createShop();
54+
}
55+
56+
private Shop createShop() {
57+
Shop shop = new Shop( 1 );
58+
59+
for ( int i = 0; i < NUMBER_OF_ARTICLES_PER_SHOP; i++ ) {
60+
shop.addArticle( new Article( i ) );
61+
}
62+
63+
return shop;
64+
}
65+
}
66+
67+
@Benchmark
68+
@BenchmarkMode(Mode.Throughput)
69+
@OutputTimeUnit(TimeUnit.SECONDS)
70+
@Fork(value = 1)
71+
@Threads(20)
72+
@Warmup(iterations = 10)
73+
@Measurement(iterations = 20)
74+
public void testCascadedValidationWithLotsOfItems(CascadedWithLotsOfItemsValidationState state, Blackhole bh) {
75+
Set<ConstraintViolation<Shop>> violations = state.validator.validate( state.shop );
76+
assertThat( violations ).hasSize( 0 );
77+
78+
bh.consume( violations );
79+
}
80+
81+
public static class Shop {
82+
@NotNull
83+
private Integer id;
84+
85+
@NotNull
86+
private List<@Valid @NotNull Article> articles = new ArrayList<>();
87+
88+
public Shop(Integer id) {
89+
this.id = id;
90+
}
91+
92+
public void addArticle(Article article) {
93+
articles.add( article );
94+
article.shops.add( this );
95+
}
96+
}
97+
98+
public static class Article {
99+
@NotNull
100+
private Integer id;
101+
102+
private Set<@Valid Shop> shops = new HashSet<>();
103+
104+
public Article(Integer id) {
105+
this.id = id;
106+
}
107+
}
108+
}

performance/src/main/jakarta-predefined-scope/org/hibernate/validator/performance/cascaded/PredefinedScopeCascadedWithLotsOfItemsAndMoreConstraintsValidation.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,7 @@ public static class Shop {
9494
private String name;
9595

9696
@NotNull
97-
@Valid
98-
private List<Article> articles = new ArrayList<>();
97+
private List<@Valid @NotNull Article> articles = new ArrayList<>();
9998

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

performance/src/main/jakarta-predefined-scope/org/hibernate/validator/performance/cascaded/PredefinedScopeCascadedWithLotsOfItemsValidation.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,7 @@ public static class Shop {
9191
private Integer id;
9292

9393
@NotNull
94-
@Valid
95-
private List<Article> articles = new ArrayList<>();
94+
private List<@Valid @NotNull Article> articles = new ArrayList<>();
9695

9796
public Shop(Integer id) {
9897
this.id = id;

performance/src/main/jakarta/org/hibernate/validator/performance/cascaded/CascadedValidation.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,7 @@ public static class Person {
7474
@NotNull
7575
String name;
7676

77-
@Valid
78-
Set<Person> friends = new HashSet<>();
77+
Set<@Valid Person> friends = new HashSet<>();
7978

8079
public Person(String name) {
8180
this.name = name;
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.validator.performance.cascaded;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
import java.util.ArrayList;
10+
import java.util.HashSet;
11+
import java.util.List;
12+
import java.util.Set;
13+
import java.util.concurrent.TimeUnit;
14+
15+
import jakarta.validation.ConstraintViolation;
16+
import jakarta.validation.Valid;
17+
import jakarta.validation.Validation;
18+
import jakarta.validation.Validator;
19+
import jakarta.validation.ValidatorFactory;
20+
import jakarta.validation.constraints.NotNull;
21+
import org.openjdk.jmh.annotations.Benchmark;
22+
import org.openjdk.jmh.annotations.BenchmarkMode;
23+
import org.openjdk.jmh.annotations.Fork;
24+
import org.openjdk.jmh.annotations.Measurement;
25+
import org.openjdk.jmh.annotations.Mode;
26+
import org.openjdk.jmh.annotations.OutputTimeUnit;
27+
import org.openjdk.jmh.annotations.Scope;
28+
import org.openjdk.jmh.annotations.State;
29+
import org.openjdk.jmh.annotations.Threads;
30+
import org.openjdk.jmh.annotations.Warmup;
31+
import org.openjdk.jmh.infra.Blackhole;
32+
33+
public class CascadedWithLotsOfItemsAndCyclesValidation {
34+
35+
private static final int NUMBER_OF_ARTICLES_PER_SHOP = 5000;
36+
37+
@State(Scope.Benchmark)
38+
public static class CascadedWithLotsOfItemsValidationState {
39+
public volatile Validator validator;
40+
41+
public volatile Shop shop;
42+
43+
public CascadedWithLotsOfItemsValidationState() {
44+
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
45+
validator = factory.getValidator();
46+
47+
shop = createShop();
48+
}
49+
50+
private Shop createShop() {
51+
Shop shop = new Shop( 1 );
52+
53+
for ( int i = 0; i < NUMBER_OF_ARTICLES_PER_SHOP; i++ ) {
54+
shop.addArticle( new Article( i ) );
55+
}
56+
57+
return shop;
58+
}
59+
}
60+
61+
@Benchmark
62+
@BenchmarkMode(Mode.Throughput)
63+
@OutputTimeUnit(TimeUnit.SECONDS)
64+
@Fork(value = 1)
65+
@Threads(20)
66+
@Warmup(iterations = 10)
67+
@Measurement(iterations = 20)
68+
public void testCascadedValidationWithLotsOfItems(CascadedWithLotsOfItemsValidationState state, Blackhole bh) {
69+
Set<ConstraintViolation<Shop>> violations = state.validator.validate( state.shop );
70+
assertThat( violations ).hasSize( 0 );
71+
72+
bh.consume( violations );
73+
}
74+
75+
public static class Shop {
76+
@NotNull
77+
private Integer id;
78+
79+
@NotNull
80+
private List<@Valid @NotNull Article> articles = new ArrayList<>();
81+
82+
public Shop(Integer id) {
83+
this.id = id;
84+
}
85+
86+
public void addArticle(Article article) {
87+
articles.add( article );
88+
article.shops.add( this );
89+
}
90+
}
91+
92+
public static class Article {
93+
@NotNull
94+
private Integer id;
95+
96+
private Set<@Valid Shop> shops = new HashSet<>();
97+
98+
public Article(Integer id) {
99+
this.id = id;
100+
}
101+
}
102+
}

performance/src/main/jakarta/org/hibernate/validator/performance/cascaded/CascadedWithLotsOfItemsAndMoreConstraintsValidation.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,7 @@ public static class Shop {
8484
private String name;
8585

8686
@NotNull
87-
@Valid
88-
private List<Article> articles = new ArrayList<>();
87+
private List<@Valid @NotNull Article> articles = new ArrayList<>();
8988

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

performance/src/main/jakarta/org/hibernate/validator/performance/cascaded/CascadedWithLotsOfItemsValidation.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,7 @@ public static class Shop {
8080
private Integer id;
8181

8282
@NotNull
83-
@Valid
84-
private List<Article> articles = new ArrayList<>();
83+
private List<@Valid @NotNull Article> articles = new ArrayList<>();
8584

8685
public Shop(Integer id) {
8786
this.id = id;

0 commit comments

Comments
 (0)