문제

STL을 많이 사용하는 매우 대규모 컴퓨팅 라이브러리에서 작업하고 있습니다. 라이브러리는 MSVC2003을 사용하여 구축되고 있으며 STL 구현을 사용하고 있습니다. 라이브러리가 메모리 요구 사항을 낮추고 성능을 높이는 데 도움이되는 대체 STL 구현을 찾고 있습니다.

현재 최신 버전의 MSVC로 전환 할 수 없습니다.

가능한 경우 벤치 마크를 기반으로하지 않은 실제 사용법에 대한 피드백을 원합니다.

편집 : 예를 들어 일부 STL 구현 (예 : STLSOFT)과 같은 좀 더 명확하게하기 위해 문자열 연결에 대한 특정 최적화를 제안합니다. 이것들은 영향력이 작을 수 있지만 큰 개선으로 이어질 수 있습니다. stlport는 목표를 명확하게 말한 또 다른 좋은 예입니다. 주변에 가장 빠른 STL 구현이 있으면 stdlib ++ 등이 있습니다.이 모든 것은 좋은 후보자가 될 수 있지만 모든 것을 테스트 할 시간이 없으며 커뮤니티 도움이 필요합니다. 그것에.

도움이 되었습니까?

해결책

stlport. 메모리 사용 차이를 측정하지는 않았지만 확실히 빠릅니다 (예, 실제 사용법).

다른 팁

기본 전제에 의문을 제기합니다. 최신 버전의 MSVC로 전환 할 수 없습니다.

새로운 STL을 다운로드하여 메모리가 낮아지고 성능 향상 "무료"를 얻을 것이라고 생각하지 않습니다. 또는 적어도, 당신이한다면, 당신은 아마도 최신 MSVC로 업데이트하는 것처럼 많은 코드 수정을해야 할 것입니다.

장기적으로, 당신이 업데이트하고 싶은 의문의 여지가 없습니다 ... 지금하십시오. ~할 것 같다 운이 좋으며 그 기억과 성능을 무료로 얻으십시오.

당신이 찾고있는 말의 선을 따라 당신에게 제안 할 수있는 유일한 것은 인텔 컴파일러를 시도하는 것입니다. 와 함께.

그 외에는 자신의 메모리와 성능 문제를 찾아 사용자 정의 컨테이너 및 알고리즘을 작성하십시오. STL은 훌륭하지만 모든 경우 모든 문제를 해결하기위한 만병 통치약은 아닙니다. 도메인 지식은 최고의 동맹국입니다.

자신의 메모리 할당자를 작성하는 것을 고려해 보셨습니까? 메모리 할당 전략이 마음에 들지 않으면 항상 전체 STL을 전환 할 필요는 없습니다. 모든 컨테이너는 교체 할당자를 허용합니다.

코드를 프로파일 링하고 문제가되는 영역에 대한 작은 조정을 고려 했습니까? 나는 그것이 당신이 고려하고있는 것보다 훨씬 덜 고통 스러울 것이라고 생각합니다.

그것의 대부분은 당신이 말하는 컨테이너와 그것을 사용하는 방법에 따라 다릅니다. 벡터는 일반적으로 현재 벡터 용량을 초과하는 요소를 추가하는 순간을 제외하고는 일반적으로 가장 작은 발자국을 가지고 있습니다. 그 순간 그것은 현재 벡터 용량에 1.5 x와 같은 것을 할당하고, 요소를 이동 (또는 최악의 경우 메모리를 할당하는 새 사본을 만들고)가 완료되면 이전 벡터 내부를 삭제하십시오. 많은 요소가 앞쪽으로 유지할 수있는 많은 요소, 예비를 사용하는 벡터가 최선의 방법입니다.

두 번째로 작은 것은 목록입니다. 임시 사본을 만들지 않을 것이라는 이점이 있습니다. 그 세트 후에는 최선의 방법이 설정되었을 것입니다. 일부 구현은 현재 슬리스트를 가지고 있으며, 이는 더 작습니다. 이 경우 TT는 페이지에 메모리를 포장하는 할당자를 쉽게 만들 수 있습니다. UNORDERED_와 같은 메모리 돼지에서 멀리 떨어져있어

MSVC에서 #define _secure_scl = 0 확실히 보안 프로그래밍 검사 (예 : 버퍼 오버런 등)에 사용되는 많은 오버 헤드를 제거하십시오.

지금까지 가장 메모리 효율적인 컨테이너는 부스트/침입입니다. 이들은 포함 된 물건에 대한 메모리를 사용하기 때문에 매우 작은 발자국을 가지고 있습니다. 따라서 링크 된 목록 또는 RB 트리 노드에 대한 작은 메모리 덩어리를 위해 힙에 가야한다는 지폐, 노드 포인터는 객체 자체의 일부입니다. 그런 다음 "컨테이너"는 루트 노드를 만들기위한 몇 개의 포인터 세트 일뿐입니다. 발자국과 할당 오버 헤드를 제거하기 위해 몇 번 사용했습니다.

MSVC2003을 포함한 대부분의 STL 구현은 제네릭 라이브러리가 잘 구현되었습니다. 따라서 한 구현에서 다른 구현에서 상당한 성능 향상을 보지 못할 것입니다.

그러나 때로는 STL 작가가 새로운 컨테이너와 알고리즘을 작성했기 때문에 데이터에 대해 알고 있기 때문에 STL보다 빠른 알고리즘 (또는 컨테이너)을 작성할 수 있습니다.

결론적으로, 응용 프로그램 성능을 향상 시키려면보다 성능있는 STL을 찾고있는 것보다 데이터에 맞는 특수 컨테이너를 만드는 것이 좋습니다.

성능이 애플리케이션에 매우 중요하고 STL이 짜여져있는 경우 오픈 소스 구현을 찾을 수 있습니다 (예 : STL- 포트, 언급했듯이) 자신을 위해 포크하여 필요에 따라 성능을 향상시겠습니까?

한편으로, 나는 이것이 STL 라이브러리의 포크를 비표준 수정하여 문제를 일으키는 미끄러운 경사가되는 것을 볼 수 있습니다. 그러나 응용 프로그램에 대한 성능의 중요성이 이러한 발생의 위험을 능가 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top