이상적인 버퍼 크기는 얼마입니까?
의 C++ 의()를 때istreamyread()는 C의fread()양, .제가 본 대부분의 프로그램은 512와 4096 사이에서 임의로 2의 거듭제곱을 선택한 것 같습니다.
- 2의 거듭제곱이 되어야 하는 이유가 있습니까? 아니면 프로그래머의 자연스러운 성향이 2의 거듭제곱이 되어야 하는 이유가 있습니까?
- "이상적인" 숫자는 무엇일까요?"이상적"이란 말은 그게 가장 빠르다는 뜻입니다.기본 장치의 버퍼 크기의 배수여야 할 것 같은데요?아니면 근본적인 스트림 객체의 버퍼?어쨌든 그 버퍼들의 크기가 어떻게 되는지 제가 어떻게 판단할 수 있을까요?한 번 더 사용하면 정확한 크기를 사용하는 것보다 속도가 더 향상될까요?
대부분의 대답은 컴파일 타임에 결정할 수 없다는 것 같습니다.저는 런타임에 그것을 찾는 것은 괜찮습니다.
:
FileInputStream을 사용할 때 이상적인 버퍼 크기는 어떻게 정합니까?
최적의 버퍼 크기는 파일 시스템 블록 크기, CPU 캐시 크기, 캐시 지연 시간 등 여러 가지와 관련이 있습니다.
대부분의 파일 시스템은 4096 또는 8192의 블록 크기를 사용하도록 구성되어 있습니다.이론적으로 디스크 블록보다 몇 바이트 더 많이 읽도록 버퍼 크기를 구성하는 경우 파일 시스템을 사용하는 작업은 매우 비효율적일 수 있습니다(즉, 한 번에 4100바이트를 읽도록 버퍼를 구성하는 경우 각 읽기에는 파일 시스템에서 2개의 블록 읽기가 필요합니다).블록이 이미 캐시에 있는 경우 RAM -> L3/L2 캐시 지연 시간에 대한 대가를 지불하게 됩니다.운이 나쁘고 블록이 아직 캐시되지 않은 경우 디스크->RAM 지연 시간에 대한 대가도 지불해야 합니다.
그렇기 때문에 대부분의 버퍼 크기가 2의 거듭제곱으로 표시되며 일반적으로 Disk 블록 크기보다 크거나 같습니다.즉, 스트림 읽기 중 하나로 인해 여러 개의 디스크 블록 읽기가 발생할 수 있지만, 이러한 읽기는 항상 전체 블록을 사용하므로 낭비되는 읽기가 없습니다.
이를 보장하면 데이터 버스 폭 정렬, DMA 정렬, 메모리 캐시 라인 정렬, 가상 메모리 페이지의 전체 수와 같은 읽기 및 후속 처리에 영향을 미치는 다른 성능 친화적인 매개 변수가 일반적으로 발생합니다.
- 적어도 제 경우에는 기본 시스템에서 크기가 2의 거듭제곱인 버퍼도 사용하고 있다고 가정하기 때문에 시도해보고 일치시키는 것이 가장 좋습니다.요즘은 대부분의 프로그래머들이 만드는 것보다 버퍼를 조금 더 크게 만들어야 한다고 생각합니다.예를 들어 4KB보다는 32KB로 하겠습니다.
- 불행하게도 미리 알기란 매우 어렵습니다.예를 들어 애플리케이션이 I/O 바인딩되었는지 CPU 바인딩되었는지에 따라 달라집니다.
- 대부분은 그냥 '원형' 번호를 고르는 것이라고 생각합니다.컴퓨터가 10진수로 작동한다면 1024 또는 8192 대신 1000 또는 10000을 선택할 것입니다.그럴만한 이유가 없습니다.
한 가지 가능한 이유는 일반적으로 디스크 섹터의 크기가 512바이트이기 때문에 여러 개의 디스크 섹터를 읽는 것이 더 효율적이기 때문입니다. 모든 하드웨어 계층과 캐싱으로 인해 로우 레벨 코드가 실제로 이러한 사실을 효율적으로 사용할 수 있다고 가정할 때입니다.장치 드라이버를 쓰거나 버퍼링되지 않은 읽기를 수행하지 않는 한 불가능할 수 있습니다.
제가 알 수 있는 어떤 이유도 그것이 반드시 2의 거듭제곱일 필요는 없습니다. 크기가 다 .size_t하지만 이것은 문제가 되지 않을 것 같습니다.
분명 버퍼가 클수록 좋지만 이는 확장성이 없기 때문에 컴파일 시 또는 가급적 런타임 시 시스템 리소스 고려 사항을 고려해야 합니다.
1. 2의 거듭제곱이 되어야 하는 이유가 있습니까? 아니면 프로그래머가 2의 거듭제곱에 대한 자연스러운 성향일 뿐입니까?
사실 그렇지 않아요.메모리 복사를 단순화하기 위해 데이터 버스 폭의 크기에도 적용할 수 있으므로 현재의 기술로는 16으로 나누는 것이 좋을 것입니다.2의 힘을 사용하면 미래의 어떤 기술과도 잘 작동할 가능성이 높습니다.
2. "이상적인" 숫자는 어떻게 됩니까?"이상적"이란 말은 그게 가장 빠르다는 뜻입니다.
가장 빠른 것은 최대한입니다.그러나 몇 킬로바이트를 초과하면 사용하는 메모리 양에 비해 성능 차이가 매우 적습니다.
기본 장치의 버퍼 크기의 배수여야 할 것 같은데요?아니면 근본적인 스트림 객체의 버퍼?어쨌든 그 버퍼들의 크기가 어떻게 되는지 제가 어떻게 판단할 수 있을까요?
기본 버퍼의 크기를 제대로 알 수 없거나, 버퍼가 그대로 유지된다는 것에 의존할 수 없습니다.
한 번 더 사용하면 정확한 크기를 사용하는 것보다 속도가 더 향상될까요?
약간, 아주 조금.
버퍼의 이상적인 크기는 하드 드라이브에 있는 한 블록의 크기라고 생각합니다. 따라서 하드 드라이브에서 데이터를 저장하거나 가져올 때 버퍼와 적절히 매핑할 수 있습니다.
언급URL : https://stackoverflow.com/questions/10698339/what-would-be-an-ideal-buffer-size
'programing' 카테고리의 다른 글
| WordPress Theme: 독립 실행형 테마 need index.php 파일 ERROR (0) | 2023.09.19 |
|---|---|
| Larravel 컨트롤러에서 Header Authorization 키를 가져오시겠습니까? (0) | 2023.09.19 |
| 자바스크립트 맵 함수가 정의되지 않은 상태로 반환되는 이유는 무엇입니까? (0) | 2023.09.19 |
| 텍스트 노드에 대한 CSS 셀렉터가 있습니까? (0) | 2023.09.19 |
| 소방서를 설치하는 동안 소방서 프로젝트를 초기화할 때 오류가 계속 발생하는 이유는 무엇입니까? (0) | 2023.09.19 |