-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathConcurrentSumTest.java
More file actions
124 lines (108 loc) · 4.4 KB
/
ConcurrentSumTest.java
File metadata and controls
124 lines (108 loc) · 4.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package module7.parallelism.sum;
import java.util.Random;
/**
* Performs experiments, comparing the speed of single-threaded vs. multithreaded
* summing algorithms.
*/
public class ConcurrentSumTest {
public static final int TRIAL_COUNT = 10;
public static void main(String[] args) {
pause();
runExperiment(100000, 10);
pause();
runExperiment(1000000, 10);
pause();
runExperiment(10000000, 10);
pause();
runExperiment(100000000, 10);
pause();
runExperiment(500000000, 10);
}
public static int[] generateIntArray(int size, int maximumValue) {
int[] arr = new int[size];
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = r.nextInt(maximumValue + 1);
}
return arr;
}
public static short[] generateShortArray(int size, short maximumValue) {
short[] arr = new short[size];
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = (short)r.nextInt(maximumValue + 1);
}
return arr;
}
public static void pause() {
try {
System.out.print("Press enter to continue...");
System.in.read();
System.out.println();
} catch (java.io.IOException e) {}
}
public static void runExperiment(int size, int bound) {
int[] linearTimes = new int[TRIAL_COUNT];
int[] concurrentTimes = new int[TRIAL_COUNT];
System.out.printf("==== MULTITHREADING TESTS (ARRAY SIZE: %,d - BOUND: %,d) ====\n\n",
size, bound);
try {
for (int i = 0; i < TRIAL_COUNT; i++) {
// Create a random array
int arrayDuration = (int)System.currentTimeMillis();
short[] bigRandomArray = generateShortArray(size, (short)bound);
arrayDuration = (int)System.currentTimeMillis() - arrayDuration;
System.out.printf("===== TRIAL #%d =====\n", i + 1);
System.out.printf("%15s %,d (took %,d ms)\n", "ARRAY LENGTH:", size, arrayDuration);
linearTimes[i] = linearTimeTrial(bigRandomArray);
concurrentTimes[i] = concurrentTimeTrial(bigRandomArray);
System.out.println();
bigRandomArray = null;
System.gc(); // garbage collect, in the hopes of freeing up memory
}
} catch (java.lang.OutOfMemoryError e) {
e.printStackTrace();
}
System.out.printf("==== MULTITHREADING TESTS (ARRAY SIZE: %,d - BOUND: %,d) ====\n\n", size, bound);
System.out.println("==== AVERAGE TIME ====");
System.out.printf("%15s %,d ms\n", "LINEAR AVG:", averageArray(linearTimes));
System.out.printf("%15s %,d ms\n", "CONCURRENT AVG:", averageArray(concurrentTimes));
}
public static int averageArray(int[] arr) {
int sum = 0;
for (int i : arr) {
sum += i;
}
return sum / arr.length;
}
public static int linearTimeTrial(int[] arr) {
// Calculate sum linearly
int duration = (int) System.currentTimeMillis();
long sum = ConcurrentSum.getLinearSum(arr);
duration = (int) System.currentTimeMillis() - duration;
System.out.printf("%15s %,d (in %d ms)\n", "LINEAR SUM:", sum, duration);
return duration;
}
public static int linearTimeTrial(short[] arr) {
// Calculate sum linearly
int duration = (int) System.currentTimeMillis();
long sum = ConcurrentSum.getLinearSum(arr);
duration = (int) System.currentTimeMillis() - duration;
System.out.printf("%15s %,d (in %d ms)\n", "LINEAR SUM:", sum, duration);
return duration;
}
public static int concurrentTimeTrial(int[] arr) {
int duration = (int) System.currentTimeMillis();
long sum = ConcurrentSum.getConcurrentSum(arr);
duration = (int) System.currentTimeMillis() - duration;
System.out.printf("%15s %,d (in %d ms)\n", "CONCURRENT SUM:", sum, duration);
return duration;
}
public static int concurrentTimeTrial(short[] arr) {
int duration = (int) System.currentTimeMillis();
long sum = ConcurrentSum.getConcurrentSum(arr);
duration = (int) System.currentTimeMillis() - duration;
System.out.printf("%15s %,d (in %d ms)\n", "CONCURRENT SUM:", sum, duration);
return duration;
}
}