Skip to content

Commit 0920423

Browse files
committed
chapter1의 exam01
1 parent 4c90609 commit 0920423

File tree

6 files changed

+94
-6
lines changed

6 files changed

+94
-6
lines changed

.idea/misc.xml

+1-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build.gradle.kts renamed to build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ plugins {
55
group = "io.concurrency"
66
version = "1.0-SNAPSHOT"
77

8+
89
repositories {
910
mavenCentral()
1011
}
File renamed without changes.

src/main/java/io/concurrency/chapter01/exam01/ConcurrencyExample.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
public class ConcurrencyExample {
77
public static void main(String[] args) {
88

9-
int cpuCores = Runtime.getRuntime().availableProcessors() * 2;
10-
// int cpuCores = 13;
9+
//CPU 코어 수의 두 배만큼의 크기를 할당 (내 컴퓨터는 코어 16개)
10+
//int cpuCores = Runtime.getRuntime().availableProcessors() * 2;
11+
12+
int cpuCores = 17;
1113

1214
// CPU 개수를 초과하는 데이터를 생성
1315
List<Integer> data = new ArrayList<>();

src/main/java/io/concurrency/chapter01/exam01/ParallelismExample.java

+6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
public class ParallelismExample {
77
public static void main(String[] args) {
88
// int cpuCores = 1;
9+
//내 컴퓨터의 CPU 코어 개수 가져오기. 내 컴퓨터는 코어 개수 16
910
int cpuCores = Runtime.getRuntime().availableProcessors();
11+
System.out.println("컴퓨터 코어 개수 = " + cpuCores);
1012

1113
// CPU 개수만큼 데이터를 생성
1214
List<Integer> data = new ArrayList<>();
@@ -16,6 +18,10 @@ public static void main(String[] args) {
1618

1719
// CPU 개수만큼 데이터를 병렬로 처리
1820
long startTime1 = System.currentTimeMillis();
21+
22+
//0부터 n까지의 데이터를 각각 쪼개서 하나의 데이터를
23+
//하나의 스레드가 맡고, 그 작업을 동시에 독립적으로 처리
24+
//즉, n+1개의 스레드가 생성
1925
long sum1 = data.parallelStream()
2026
.mapToLong(i -> {
2127
try {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# ParallelismExample
2+
병렬성 확인
3+
4+
```java
5+
//컴퓨터 CPU 코어 개수 가져오기. 내 경우 코어 개수 16개
6+
int cpuCores = Runtime.getRuntime().availableProcessors();
7+
8+
// CPU 개수(16)만큼 데이터를 생성
9+
List<Integer> data = new ArrayList<>();
10+
for (int i = 0; i < cpuCores; i++) {
11+
data.add(i);
12+
}
13+
14+
long startTime1 = System.currentTimeMillis();
15+
16+
long sum1 = data.parallelStream()
17+
.mapToLong(i -> {
18+
try {
19+
Thread.sleep(500);
20+
} catch (InterruptedException e) {
21+
throw new RuntimeException(e);
22+
}
23+
return i * i;
24+
})
25+
.sum();
26+
long endTime1 = System.currentTimeMillis();
27+
28+
System.out.println("CPU 개수만큼 데이터를 병렬로 처리하는 데 걸린 시간: " + (endTime1 - startTime1) + "ms");
29+
System.out.println("결과1: " + sum1);
30+
```
31+
- parallelStream을 통해 data 개수(CPU 개수)만큼의 스레드를 생성
32+
- 하나의 데이터를 하나의 스레드가 맡고, 그 합을 더하는 작업을 동시에 독립적으로 처리
33+
-
34+
```java
35+
컴퓨터 코어 개수 = 16
36+
CPU 개수만큼 데이터를 병렬로 처리하는 데 걸린 시간: 534ms
37+
결과1: 1240
38+
```
39+
- 병렬로 처리해서 0.5초 정도 걸림
40+
- 그럼 parallelStream을 stream으로 변경해서 수행해보면? (단일 스레드에서 연속적으로 연산 수행)
41+
```java
42+
컴퓨터 코어 개수 = 16
43+
CPU 개수만큼 데이터를 병렬로 처리하는 데 걸린 시간: 8117ms
44+
결과1: 1240
45+
```
46+
47+
48+
# ConcurrencyExample
49+
동시성 확인
50+
- CPU 코어 2배 만큼의 데이터를 생성하고, CPU 개수를 초과하는 데이터를 병려롤 처리하면?
51+
```java
52+
long startTime2 = System.currentTimeMillis();
53+
long sum2 = data.parallelStream()
54+
.mapToLong(i -> {
55+
try {
56+
Thread.sleep(500);
57+
} catch (InterruptedException e) {
58+
throw new RuntimeException(e);
59+
}
60+
return i * i;
61+
})
62+
.sum();
63+
64+
long endTime2 = System.currentTimeMillis();
65+
66+
System.out.println("CPU 개수를 초과하는 데이터를 병렬로 처리하는 데 걸린 시간: " + (endTime2 - startTime2) + "ms");
67+
System.out.println("결과2: " + sum2);
68+
```
69+
```java
70+
CPU 개수를 초과하는 데이터를 병렬로 처리하는 데 걸린 시간: 1046ms
71+
결과2: 10416
72+
```
73+
74+
- 병렬성 확인에서 보다 2배의 데이터를 처리하므로 시간이 더 소요된 것이라 볼 수도 있음.
75+
- 그럼 데이터 개수를 코어 개수보다 한 많은 17로 했을 떄, 병렬과 유사한 0.6초 정도 걸려야 함
76+
```java
77+
CPU 개수를 초과하는 데이터를 병렬로 처리하는 데 걸린 시간: 1020ms
78+
결과2: 1496
79+
```
80+
- 그러나 여전히 1초 정도 걸림
81+
- 병렬성이라는 것은 정말 CPU 하나 당 스레드가 하나씩 붙어서 동시적으로 일괄 처리하는 상태를 말함. 그렇지만 CPU 개수보다 더 많은 작업을 처리해버리면 그 때는 병렬 이점을 가져가더라도 동시성도 적용되어버림
82+
- 즉, 하나의 CPU가 동시에 2개의 스레드를 실행시키지 못하기 때문에, 한 스레드가 작업 중에 다른 스레드와 문맥 교환되어야 함

0 commit comments

Comments
 (0)