Skip to content

Commit 34907bf

Browse files
aietcnpivovarit
aietcn
authored andcommitted
BAEL-2551 add parallelprefix section in Arrays (eugenp#6184)
1 parent 369655a commit 34907bf

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.baeldung.arrays;
2+
3+
import org.openjdk.jmh.annotations.*;
4+
import org.openjdk.jmh.infra.Blackhole;
5+
6+
import java.util.Arrays;
7+
8+
public class ParallelPrefixBenchmark {
9+
private static final int ARRAY_SIZE = 200_000_000;
10+
11+
@State(Scope.Benchmark)
12+
public static class BigArray {
13+
14+
int[] data;
15+
16+
@Setup(Level.Iteration)
17+
public void prepare() {
18+
data = new int[ARRAY_SIZE];
19+
for(int j = 0; j< ARRAY_SIZE; j++) {
20+
data[j] = 1;
21+
}
22+
}
23+
24+
@TearDown(Level.Iteration)
25+
public void destroy() {
26+
data = null;
27+
}
28+
29+
}
30+
31+
@Benchmark
32+
public void largeArrayLoopSum(BigArray bigArray, Blackhole blackhole) {
33+
for (int i = 0; i < ARRAY_SIZE - 1; i++) {
34+
bigArray.data[i + 1] += bigArray.data[i];
35+
}
36+
blackhole.consume(bigArray.data);
37+
}
38+
39+
@Benchmark
40+
public void largeArrayParallelPrefixSum(BigArray bigArray, Blackhole blackhole) {
41+
Arrays.parallelPrefix(bigArray.data, (left, right) -> left + right);
42+
blackhole.consume(bigArray.data);
43+
}
44+
}

core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.baeldung.arrays;
22

3+
import static org.hamcrest.MatcherAssert.assertThat;
4+
import static org.hamcrest.Matchers.is;
35
import static org.junit.Assert.*;
46

57
import org.junit.Before;
@@ -9,6 +11,7 @@
911

1012
import java.util.Arrays;
1113
import java.util.List;
14+
import java.util.Random;
1215
import java.util.stream.Stream;
1316

1417
public class ArraysUnitTest {
@@ -150,4 +153,52 @@ public void whenAsList_thenImmutableArray() {
150153
exception.expect(UnsupportedOperationException.class);
151154
rets.add("the");
152155
}
156+
157+
@Test
158+
public void givenIntArray_whenPrefixAdd_thenAllAccumulated() {
159+
int[] arri = new int[] { 1, 2, 3, 4};
160+
Arrays.parallelPrefix(arri, (left, right) -> left + right);
161+
assertThat(arri, is(new int[] { 1, 3, 6, 10}));
162+
}
163+
164+
@Test
165+
public void givenStringArray_whenPrefixConcat_thenAllMerged() {
166+
String[] arrs = new String[] { "1", "2", "3" };
167+
Arrays.parallelPrefix(arrs, (left, right) -> left + right);
168+
assertThat(arrs, is(new String[] { "1", "12", "123" }));
169+
}
170+
171+
@Test
172+
public void whenPrefixAddWithRange_thenRangeAdded() {
173+
int[] arri = new int[] { 1, 2, 3, 4, 5 };
174+
Arrays.parallelPrefix(arri, 1, 4, (left, right) -> left + right);
175+
assertThat(arri, is(new int[] { 1, 2, 5, 9, 5 }));
176+
}
177+
178+
@Test
179+
public void whenPrefixNonAssociative_thenError() {
180+
boolean consistent = true;
181+
Random r = new Random();
182+
for (int k = 0; k < 100_000; k++) {
183+
int[] arrA = r.ints(100, 1, 5).toArray();
184+
int[] arrB = Arrays.copyOf(arrA, arrA.length);
185+
186+
Arrays.parallelPrefix(arrA, this::nonassociativeFunc);
187+
188+
for (int i = 1; i < arrB.length; i++) {
189+
arrB[i] = nonassociativeFunc(arrB[i - 1], arrB[i]);
190+
}
191+
consistent = Arrays.equals(arrA, arrB);
192+
if(!consistent) break;
193+
}
194+
assertFalse(consistent);
195+
}
196+
197+
/**
198+
* non-associative int binary operator
199+
*/
200+
private int nonassociativeFunc(int left, int right) {
201+
return left + right*left;
202+
}
203+
153204
}

0 commit comments

Comments
 (0)