Skip to content

Commit

Permalink
update content
Browse files Browse the repository at this point in the history
  • Loading branch information
dev-jonghoonpark committed Mar 15, 2024
1 parent ed2df1c commit 6a250e6
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions _posts/2024-03-15-java-l1-cache-miss.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,16 +96,24 @@ Line: 332249 ns ; Item: 330512

### touchEvenyItem() 이 touchEveyLine() 보다 16배 더 오래걸리지 않는 이유는 무엇일까?

두 메소드가 동일한 cache line read 횟수를 가지기 때문이다.
두 메소드가 동일한 cache read 횟수를 가지기 때문이다.

메인 메모리에서 cpu cache로 데이터를 가져올 때는 캐시 라인이라는 개념이 사용된다.
**캐시 라인** 은 캐시가 데이터를 메모리로부터 한 번에 가져오는 데이터의 단위 크기이다.
일반적으로 L1 **캐시 라인** 은 64 바이트이고, 자바에서 int는 4바이트 이다.
따라서 한 캐시 라인은 16개의 int를 가지게 된다.

데이터를 수정하는데는 얼마 걸리지 않는다.
그에 비해 메인 메모리에서 cpu cache로 데이터를 불러오는데에는 훨씬 많은 시간이 소요된다.

그렇기 때문에 한개씩 데이터를 수정하나, 16개씩 건너뛰며 데이터를 수정하나 전체적인 시간에서는 큰 차이는 없었던 것이다.
각 step 에서 16씩 증가하게 되면 순차적으로 읽었을 때와 cache read 트리거 시점이 같다.

> 1번째 항목에 접근할 때 : 1 ~ 16 번째 가져옴
> 17번째 항목에 접근할 때 : 17 ~ 32 번째 가져옴
> ...
그렇기 때문에 한개씩 데이터를 수정하나, 16개씩 건너뛰며 데이터를 수정하나,
같은 cache line read 횟수를 가지기 때문에 전체적인 시간에서는 큰 차이는 없었던 것이다.

### 코드 wram up?

Expand Down

0 comments on commit 6a250e6

Please sign in to comment.