๋งค์ผ๋ฉ์ผ ๋ฐฑ์๋ ์ง๋ฌธ์ ์ฐธ๊ณ ํด ๊ฐ์ธ์ ์ผ๋ก ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค.
์ค๋ฅ๊ฐ ์๋ค๋ฉด ์ธ์ ๋ ํผ๋๋ฐฑ ์ฃผ์๋ฉด ๋ฐ๋ก ๋ฐ์ํ๊ฒ ์ต๋๋ค..!
์ฐธ์กฐ ์ง์ญ์ฑ์ ์๋ฆฌ๋?
์ฐธ์กฐ ์ง์ญ์ฑ์ ์๋ฆฌ(Locality of reference)๋ CPU๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ๋ ํน์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ฐ๋ณต์ ์ผ๋ก ์ ๊ทผํ๋ ๊ฒฝํฅ์ด ์๋ค๋ ์๋ฆฌ๋ฅผ ์๋ฏธํ๋ฉฐ, ์ฃผ๋ก ์บ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ค๋ฅ ์ ๋์ฌ CPU์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํ์๋ฅผ ์ค์ด๋ ๋ฐ ์ด์ฉ๋จ
=> ํฌ๊ฒ ์๊ฐ ์ง์ญ์ฑ๊ณผ ๊ณต๊ฐ ์ง์ญ์ฑ์ด ์กด์ฌํจ
์๊ฐ ์ง์ญ์ฑ (Temporal locality)
์๊ฐ ์ง์ญ์ฑ(Temporal locality) ์ด๋ CPU๋ ์ต๊ทผ์ ์ ๊ทผํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊น์ด ์์ ์ ๋ค์ ์ ๊ทผํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ์ฑ์ง์
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += array[10]; // ๊ฐ์ ์ธ๋ฑ์ค ๋ฐ๋ณต ์ ๊ทผ
}
์ฌ๊ธฐ์ array[10]์ ๋ฃจํ๋ง๋ค ๊ณ์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ CPU๋ ์ด๋ฅผ ์บ์์ ๋ณด๊ดํ๊ณ ๋น ๋ฅด๊ฒ ์ฌ์ฌ์ฉํ ์ ์์
=> ์ด๋ ๊ฒ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ ๊ตฌ์กฐ๋ ์๊ฐ ์ง์ญ์ฑ์ ์์๋ก ๋ณผ ์ ์์
๊ณต๊ฐ ์ง์ญ์ฑ (Spatial locality)
๊ณต๊ฐ ์ง์ญ์ฑ(Spatial locality) ์ด๋ CPU๋ ํ ๋ฒ ์ ๊ทผํ ๋ฐ์ดํฐ ๊ทผ์ฒ์ ๋ฐ์ดํฐ๋ ๊ณง ์ ๊ทผ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ์ฑ์ง์
for (int i = 0; i < 100; i++) {
sum += array[i]; // ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
}
์ ์ฝ๋๋ array[0], array[1], array[2] ์ฒ๋ผ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ ํ ์์น๋ฅผ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ๊ธฐ ๋๋ฌธ์, CPU๊ฐ ๋ฏธ๋ฆฌ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์บ์์ ๋ก๋ฉํด ๋๊ณ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์
์์ ์ฝ๋ ๊ฐ์
public class LocalityTest {
@Test
void test() {
int size = 10240;
int[][] array = new int[size][size];
long beforeTime = System.currentTimeMillis();
for (int j = 0; j < size; j++) {
for (int i = 0; i < size; i++) {
array[i][j]++;
}
}
long afterTime = System.currentTimeMillis();
long diffTime = afterTime - beforeTime;
System.out.println("์ํ์๊ฐ(m) : " + diffTime); // 577ms
}
}
์ ์ฝ๋๋ 2์ฐจ์ ๋ฐฐ์ด์ ์ํํ๋ฉด์(์ด ๋จผ์ ) ๊ฐ์ ์ฆ๊ฐํ๋ ์ฝ๋์ธ๋ฐ JAVA์์ 2์ฐจ์ ๋ฐฐ์ด์ ๋ด๋ถ์ ์ผ๋ก 1์ฐจ์ ๋ฐฐ์ด์ ๋ํ ์ฐธ์กฐ ๋ฐฐ์ด์
=> array[i]๋ ๊ฐ๊ฐ ๋ ๋ฆฝ๋ int[] ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ๋์ ์ฐ์์ ์ผ๋ก ๋ฐฐ์น๋๋ ๊ฒ์ด ๋ณด์ฅ๋์ง ์์
CPU ์บ์๋ ๊ณต๊ฐ ์ง์ญ์ฑ์ ์๋ฆฌ์ ๊ทผ๊ฑฐ๋ฅผ ๋์ด ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ์ธ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์บ์ฑํ ํ
๋ฐ ์ด์ ๋จผ์ ์ํํ๊ณ ํ์ ์ ๊ทผํ๊ฒ ๋๋ค๋ฉด ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ์์์ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋์ด ์บ์ ํํธ์จ์ด ๋จ์ด์ง
=> ์ ์ฝ๋๋ฅผ ๊ฐ์ ํ๊ธฐ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ํ์ ๋จผ์ ์ ๊ทผํ์ฌ ์บ์ ํํธ์จ์ ๋์ด๋ ๊ฒ์
public class LocalityTest {
@Test
void test() {
int size = 10240;
int[][] array = new int[size][size];
long beforeTime = System.currentTimeMillis();
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
array[i][j]++;
}
}
long afterTime = System.currentTimeMillis();
long diffTime = afterTime - beforeTime;
System.out.println("์ํ์๊ฐ(m) : " + diffTime); // 28ms
}
}
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๊ฐ์ด ๋ฐฐ์ด์ ํ์ ๋จผ์ ์ํํ๊ณ ์ด์ ๋์ค์ ์ํํ๋ ์ฝ๋์ธ๋ฐ ์ด๋ array[i]๋ผ๋ ํ๋์ ๋ฐฐ์ด์ ์ฐ์์ ์ผ๋ก ์ ๊ทผํ๊ฒ ๋๋ฉฐ, CPU ์บ์์ ๊ณต๊ฐ ์ง์ญ์ฑ์ ๊ทน๋ํํ ์ ์์
(์ด์ ๋จผ์ ์ํํ๋ ์ฝ๋์ ์ฝ 20๋ฐฐ ์ด์์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๋๋ ๊ฒ ์ ํ์ธํ ์ ์์)
์์ฝ
์ฐธ์กฐ ์ง์ญ์ฑ์ ๊ณ ์ฑ๋ฅ ์ดํ๋ฆฌ์ผ์ด์
์ ์ค๊ณํ ๋ ๊ผญ ์์์ผ ํ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ํต์ฌ ์๋ฆฌ์
(๋จ์ํ ๋ฃจํ ์์ ๋ณ๊ฒฝ๋ง์ผ๋ก๋ ์์ญ ๋ฐฐ์ ์ฑ๋ฅ ํฅ์์ ์ด๋์ด๋ผ ์ ์์)
์บ์๋ฅผ ์ ํ์ฉํ๋ ค๋ฉด
- ์๊ฐ ์ง์ญ์ฑ : ์ต๊ทผ์ ์ ๊ทผํ ๋ฐ์ดํฐ๋ ๋ ์ ๊ทผํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค
- ๊ณต๊ฐ ์ง์ญ์ฑ : ์ ๊ทผํ ์์น ๊ทผ์ฒ๋ ๊ณง ์ ๊ทผ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค
์ ์ ๊ฒฝ์จ์ผํจ!!
L1 ์บ์๋ ์๊ฐ ์ง์ญ์ฑ์ ํนํ ๋ฏผ๊ฐํ๊ณ , L2๋ L3 ์บ์๋ ๊ณต๊ฐ ์ง์ญ์ฑ๋ ๊ณ ๋ คํด ๋์ํจ
'๐ป CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฟ ํค(Cookie)์ ์ธ์ (Session)์ ์ฐจ์ด (0) | 2025.06.27 |
---|---|
๋ช ๋ น์ด ํ์ดํ๋ผ์ด๋์ด๋? (1) | 2025.06.24 |
Go(Golang)์ด๋? (0) | 2025.06.06 |
Java ์ ์ถ๋ ฅ(I/O) ์์๋ณด๊ธฐ (0) | 2025.06.03 |
Java Collections Framework ์์๋ณด๊ธฐ (0) | 2025.05.29 |