프로그래밍의 메모리 관리가 관련이없는 문제입니까?
메모리 관리 (또는 제어)는 실제로 C 및 C ++를 사용하는 주요 이유입니다.
메모리는 현재 비교적 저렴합니다.
빠른 메모리가 아닙니다. 우리는 여전히 i7의 L1에 32KB 데이터 캐시, L2에 256KB, L3 / 코어에 2MB와 같은 소수의 레지스터를보고 있습니다. 그것은 말했다 :
작업 메모리 (예 : 임베디드 시스템 등)에 대한 엄격한 제한이있는 대상 플랫폼으로 말하지 않는다면 오늘날 범용 언어를 선택할 때 메모리 사용이 문제가되어야합니까?
일반적인 수준의 메모리 사용은 아닐 수도 있습니다. 나는 여분의 공간이 풍부하고 더 풍부해야하지만, 50MB의 DRAM과 수백 MB의 하드 디스크 공간을 필요로하는 메모장을 좋아하지 않는다는 점에서 약간 비현실적이다. 나는 오랫동안 주변에 있었고, 그런 간단한 응용 프로그램이 킬로 바이트로 할 수있는 것에 대해 너무 많은 메모리를 차지한다는 것을 알기 위해 이상하고 이상한 느낌이 들었습니다. 즉, 여전히 멋지고 반응이 좋으면 그런 일이 생기면 나와 함께 살 수있을 것입니다.
내 분야에서 메모리 관리가 중요한 이유는 일반적으로 메모리 사용량을 크게 줄이지 않기 때문입니다. 수백 메가 바이트의 메모리 사용은 메모리에 자주 액세스하지 않는 경우 사소한 방식으로 응용 프로그램 속도를 늦추지 않습니다 (예 : 버튼 클릭 또는 다른 형태의 사용자 입력시에만 가능합니다. 버튼을 초당 백만 번 클릭 할 수있는 한국 스타 크래프트 플레이어에 대해 이야기하고 있습니다).
내 분야에서 중요한 이유 는 중요한 경로에서 매우 자주 액세스되는 (예 : 모든 단일 프레임에서 반복되는) 메모리를 단단히 고정 시키는 것입니다. 단일 프레임마다 루프로 액세스해야하는 백만 개의 요소 중 하나에 만 액세스 할 때마다 캐시 미스를 원하지 않습니다. 64 바이트 캐시 라인과 같이 큰 청크에서 느린 메모리에서 빠른 메모리로 계층 구조 아래로 메모리를 이동할 때 64 바이트에 여러 요소의 데이터를 넣을 수 있다면 64 바이트에 모두 관련 데이터가 포함되어 있으면 정말 유용합니다. 액세스 패턴이 데이터를 제거하기 전에 모두 사용하도록되어있는 경우.
수백만 개의 요소에 대해 자주 액세스하는 데이터는 기가 바이트이지만 20MB에 불과할 수 있습니다. 메모리가 빡빡하고 서로 가까이 있으면 캐시 미스를 최소화하면 메모리를 관리하고 제어하는 것이 유용한 경우 프레임 당 반복되는 프레임 속도 차이가 여전히 발생합니다. 몇 백만 개의 정점이있는 구의 간단한 시각적 예 :
위의 내용은 메쉬의 지속적인 데이터 구조 표현을 테스트하기 때문에 실제로 변경 가능한 버전보다 느립니다. 그러나 그 점을 제외하고는 데이터의 절반에서도 프레임 속도를 달성하는 데 어려움을 겪었습니다. ) 캐시 누락을 최소화하고 메쉬 데이터에 메모리를 사용하지 않기 때문입니다. 메쉬는 다각형, 가장자리, 꼭짓점, 사용자가 연결하고자하는 텍스처 맵, 뼈 무게 등 많은 상호 의존 데이터를 저장하기 때문에 이와 관련하여 다루기 어려운 까다로운 데이터 구조 중 일부입니다. 컬러 맵, 선택 세트, 모프 타깃, 엣지 웨이트, 폴리곤 머티리얼 등
지난 수십 년 동안 많은 메쉬 시스템을 설계하고 구현했으며 속도는 종종 메모리 사용에 매우 비례했습니다. 내가 작업했을 때보 다 훨씬 많은 메모리를 사용하고 있지만 새로운 메쉬 시스템은 첫 번째 디자인 (거의 20 년 전)보다 10 배 이상 빠르며 약 1/10의 기억. 최신 버전은 인덱싱 된 압축을 사용하여 가능한 한 많은 데이터를 크램 핑하고 압축 해제의 처리 오버 헤드에도 불구하고 압축은 실제로 성능이 향상되었으므로 다시는 귀중한 빠른 메모리가 거의 없기 때문입니다. 이제 텍스처 좌표, 가장자리 주름, 재료 할당 등을위한 백만 개의 다각형 메쉬를 약 30MB의 공간 인덱스와 함께 맞출 수 있습니다.
다음은 GF 8400이있는 i3에 8 백만 개가 넘는 사변형과 다중 분할 세분화 방식이있는 변경 가능한 프로토 타입입니다 (몇 년 전). 불변 버전보다 빠르지 만 불변 버전을 유지 관리하기가 훨씬 쉽고 성능 적중이 나쁘지 않기 때문에 프로덕션에는 사용되지 않습니다. 와이어 프레임은 패싯을 나타내지 않지만 패싯의 모든 점은 브러시로 수정되지만 패치 (와이어는 실제로 곡선이며, 그렇지 않으면 전체 메시는 검은 색임)를 나타냅니다.
어쨌든, 나는 메모리 관리가 매우 도움이되고 또한 사람들이 내가 내 엉덩이에서 말하고 있다고 생각하지 않도록 구체적인 예와 영역을 보여주기 위해 위의 일부를 보여주고 싶었습니다. 사람들이 메모리가 너무 풍부하고 저렴하다고 말할 때 약간 짜증을내는 경향이 있습니다. DRAM 및 하드 드라이브와 같은 느린 메모리에 대한 이야기이기 때문입니다. 빠른 메모리에 대해 이야기 할 때 여전히 작고 귀중합니다. 그리고 매우 중요한 (즉, 모든 경우가 아닌 일반적인 경우) 경로의 성능은 소량의 빠른 메모리를 재생하고 가능한 한 효과적으로 활용하는 것과 관련이 있습니다. .
이러한 종류의 경우 C ++과 같은 고급 객체를 디자인 할 수있는 언어로 작업하는 것이 도움이됩니다. 예를 들어, 이러한 객체를 하나 이상의 연속 배열에 저장할 수는 있지만 이러한 모든 객체는 연속적으로 표시되며 객체 당 불필요한 메모리 오버 헤드가 없습니다 (예 : 모든 객체에 반영 또는 가상 디스패치가 필요한 것은 아님). 실제로 성능이 중요한 영역으로 이동하면 실제로 개체 풀을 처리하고 기본 데이터 형식을 사용하여 개체 오버 헤드, GC 비용을 피하고 메모리에 자주 액세스하는 등의 메모리 제어 기능을 제공하는 것이 실제로 생산성 향상이됩니다. 함께 인접합니다.
따라서 메모리 관리 / 제어 (또는 부족)는 실제로 생산성을 향상시켜 문제를 해결할 수있는 언어를 선택하는 주된 이유입니다. 나는 성능에 중요하지 않은 코드를 확실히 작성하고 있으며, C에서 포함하기 쉬운 Lua를 사용하는 경향이 있습니다.