diff --git a/_posts/2024-03-15-java-l1-cache-miss.md b/_posts/2024-03-15-java-l1-cache-miss.md index 2fc4d05..d126cbe 100644 --- a/_posts/2024-03-15-java-l1-cache-miss.md +++ b/_posts/2024-03-15-java-l1-cache-miss.md @@ -96,8 +96,9 @@ Line: 332249 ns ; Item: 330512 ### touchEvenyItem() 이 touchEveyLine() 보다 16배 더 오래걸리지 않는 이유는 무엇일까? -두 메소드가 동일한 cache line read 횟수를 가지기 때문이다. +두 메소드가 동일한 cache read 횟수를 가지기 때문이다. +메인 메모리에서 cpu cache로 데이터를 가져올 때는 캐시 라인이라는 개념이 사용된다. **캐시 라인** 은 캐시가 데이터를 메모리로부터 한 번에 가져오는 데이터의 단위 크기이다. 일반적으로 L1 **캐시 라인** 은 64 바이트이고, 자바에서 int는 4바이트 이다. 따라서 한 캐시 라인은 16개의 int를 가지게 된다. @@ -105,7 +106,14 @@ Line: 332249 ns ; Item: 330512 데이터를 수정하는데는 얼마 걸리지 않는다. 그에 비해 메인 메모리에서 cpu cache로 데이터를 불러오는데에는 훨씬 많은 시간이 소요된다. -그렇기 때문에 한개씩 데이터를 수정하나, 16개씩 건너뛰며 데이터를 수정하나 전체적인 시간에서는 큰 차이는 없었던 것이다. +각 step 에서 16씩 증가하게 되면 순차적으로 읽었을 때와 cache read 트리거 시점이 같다. + +> 1번째 항목에 접근할 때 : 1 ~ 16 번째 가져옴 +> 17번째 항목에 접근할 때 : 17 ~ 32 번째 가져옴 +> ... + +그렇기 때문에 한개씩 데이터를 수정하나, 16개씩 건너뛰며 데이터를 수정하나, +같은 cache line read 횟수를 가지기 때문에 전체적인 시간에서는 큰 차이는 없었던 것이다. ### 코드 wram up?