@prefetch — 메모리를 미리 읽어와서 성능만 챙기는 내장 함수
@prefetch — 메모리를 미리 읽어와서 성능만 챙기는 내장 함수
프로그램의 동작은 그대로 두고 성능만 바꿔주는 구문이에요. 대상 CPU가 미리 읽기(prefetch) 명령을 지원할 때 실제로 그 명령을 내보내고, 지원하지 않으면 그냥 아무 일도 하지 않는 빈 동작이 됩니다.
본문
@prefetch 내장 함수는 대상 CPU가 미리 읽기(prefetch) 명령을 지원할 때 그 명령을 내보내라고 컴파일러에 지시하는 구문이에요. 대상 CPU가 요청한 미리 읽기 명령을 지원하지 않는다면, 이 내장 함수는 그냥 아무 일도 하지 않는 빈 동작(no-op)이 돼요.
여기서 중요한 건 이 함수가 프로그램의 동작에는 전혀 영향을 주지 않고, 성능 특성에만 영향을 준다는 점이에요. 결과 값을 바꾸는 게 아니라, 그 결과에 이르는 속도만 바꾸는 함수예요.
@prefetch(ptr: anytype, comptime options: PrefetchOptions) void
ptr 인자는 어떤 포인터 타입이든 될 수 있고, 미리 읽어올 메모리 주소를 결정해요. 그런데 이 함수는 포인터를 역참조(dereference)하지 않아요. 즉 실제로 값을 읽으러 가지 않죠. 그래서 유효하지 않은 메모리를 가리키는 포인터를 넘겨도 완전히 합법적이고, 그런 경우에도 잘못된 동작(Illegal Behavior)이 생기지 않아요.
옵션을 담는 PrefetchOptions 구조체는 @import("std").lang.PrefetchOptions로 가져와서 쓸 수 있어요.
더 알아보기(Learn more)
- 미리 읽기(prefetch)는 하드웨어 입장에서 다음에 쓸 데이터를 캐시에 미리 올려두는 기법이에요. 성능 최적화를 다룰 때 실제 측정과 함께 다뤄보면 좋아요.
- Zig 문서의 @prefetch 원문과 이웃한 메모리 관련 내장 함수들을 함께 읽어보세요.