2010-04-23 3 views
2

C++에서 간단한 포인터 연산을 사용하여 매우 큰 파일에서 mmap 호출을 사용하여 읽습니다. 문제는 내가 KB 단위로 작은 덩어리의 데이터를 여러 번 읽었을 때 각각의 읽기가 이전과 동일한 시간이 걸린다는 것입니다. 요청을 수행하기 위해 디스크에 액세스 중인지 또는 요청이 첫 번째 이후의 호출에서 주 메모리 (페이지 캐시)에서 충족되는지 여부를 어떻게 알 수 있습니까?mmap에서 캐싱

+0

왜 중요한가요? –

+0

속도! 이후의 호출이 디스크 액세스가 아닌 캐시에서 수행되기를 기대할 때 첫 번째 호출보다 빠른 호출이 아닌 이유를 알고 싶습니다. – myahya

+0

mmap 호출에 걸린 시간도 프로파일 했습니까? mmap을 호출 할 때 이미 첫 페이지를 캐시했을 수도 있습니다. 디스크에 저장하는 것은 매우 비쌉니다. 매우 이상한 액세스 패턴이있는 경우 매 액세스마다 캐시 미스가 발생할 수도 있지만 (액세스 패턴이 순차적입니까?), 현대의 모든 주요 데스크톱 운영 체제가 캐시됩니다. –

답변

3

문제는 다음과 같습니다. 캐시에서 두 가지 읽기가 수행되었습니다. 캐싱은 데이터를 요청하기 전에 파일을 열거 나 mmapped했을 때 시작됩니다. 이를 확인하려면 I 발행 :

나는 동일한 데이터를 가져 오기위한 두 개의 반복을 실행하면, 다음, 캐시를 플러시

echo 3 > /proc/sys/vm/drop_caches

, 첫 번째 실행은 (내 경우) 두 번째보다 10 배 느린 .

0

locality of reference을 악용하면 최상의 캐시 성능을 얻을 수 있습니다. 즉, 변수를 통해 가까이있는 변수에 접근하여 (예 : 변수를 통해 순서가 늘어나는 순서로 스테핑) 이러한 접근을 시간 내에 수행하면 (즉, 이러한 요소를 읽는 동안 다른 많은 메모리 액세스를 수행하지 않는 경우) 당신은 최고의 캐시 성능을 얻을 것이다. 각 읽기가 대략 동일한 시간이 걸리면 캐시 될 가능성이 높습니다. 캐시에서 서비스가 제공되지 않는 경우 일반적으로 몇 가지 빠른 읽기 (캐시 적중)와 그 다음에 스파이크 (캐시 실패), 더 빠른 읽기가 표시됩니다. 거의 모든 시스템에서 캐시 미스가 있으면 데이터가있는 청크가 캐시로로드되므로 근처의 변수 (동일한 청크에 있음)에 액세스하면 해당 데이터가 캐시에 저장됩니다.