컴퓨터에서 CPU의 코어는 다음과 같이 구성되어 있습니다.
ALU는 연산을 수행하는 장치이고,
L1/L2 캐시의 경우 캐싱을 수행하는 장치입니다.
캐싱은 기록하는 작업을 의미하는데 캐싱을 수행하는 이유는 다음과 같습니다.
RAM은 변동 사항을 반영해야 하는 메모리입니다.
이때 변동 사항이 들어올 때마다 반영하는 것은 매우 비효율적인 작업입니다.
따라서 어느 정도 기록을 한뒤에 한번에 모아서 반영하는 것이 훨씬 효율적입니다.
그렇기에 캐싱이 수행됩니다.
캐싱은 2가지의 기준을 세워 수행합니다.
하나는 시간적인 기준이고, 다른 하나는 공간적인 기준입니다.
시간적인 기준은 다음과 같습니다.
가장 최근에 발생한 변동에서 또 다른 변동이 생길 가능성이 높으므로 가장 최근에 발생한 변동을 캐싱합니다.
이를 영어로는 Temporal Locality 라고 부릅니다.
공간적인 기준은 다음과 같습니다.
변동이 발생한 부분 인근에서 또 다른 변동이 생길 가능성이 높으므로 변동과 그 주변을 캐싱합니다.
이를 영어로는 Spacial Locality 라고 부릅니다.
그렇다면 이제 예시를 통해 캐싱이 어떻게 이뤄지는지 알아보겠습니다.
예제 코드는 다음과 같습니다.
1) 예제코드
class Program
{
static void Main(string[] args)
{
int[,] array = new int[10000, 10000];
{
long start = DateTime.Now.Ticks;
for (int i = 0; i < 10000; i++)
for (int j = 0; j < 10000; j++)
array[i, j] = 1;
long end = DateTime.Now.Ticks;
Console.WriteLine($"[i, j]의 순서로 걸린 시간은 {end - start} 입니다.");
}
{
long start = DateTime.Now.Ticks;
for (int i = 0; i < 10000; i++)
for (int j = 0; j < 10000; j++)
array[j, i] = 1;
long end = DateTime.Now.Ticks;
Console.WriteLine($"[j, i]의 순서로 걸린 시간은 {end - start} 입니다.");
}
}
}
10000 X 10000 배열에 값을 할당하는 아주 간단한 예제입니다.
그러나 첫번째 배열은 행의 열들을 차례대로 순회하지만,
두번째 배열은 행들을 건너뛰면서 순회합니다.
실행 결과는 다음과 같습니다.
단순 수학 계산으로는 수행시간이 동일해야 하지만, 위와 같이 꽤 큰 차이가 발생합니다.
이는 첫번째 배열은 공간 캐싱의 영향을 받았고, 두번째 배열은 공간 캐싱의 영향을 받지 못해 발생합니다.
'C#' 카테고리의 다른 글
Interlocked (0) | 2024.11.27 |
---|---|
Memory Barrier (0) | 2024.11.27 |
컴파일러 최적화 (0) | 2024.11.25 |
C#에서 쓰레드를 생성하는 방법 (0) | 2024.11.25 |
람다식 (0) | 2024.09.28 |