2012-11-28 4 views
1

나는 SO에이 게시물을 읽고 있었다 :는 C 사이의 성능 질문 ++ 및 C#에 대한 답변입니다STL/표준 C++ 컨테이너는 얼마나 효율적으로 효율적입니까?

https://stackoverflow.com/a/3183607/997112

합니다. 이 포스터는 고주파 거래 배경에서 나온 것으로, 나노초 절약에 대한 검색으로 인해 HF 작업을위한 클래스 라이브러리를 작성했다고합니다. 그의 게시물에서 그는 C++ STL을 거의 사용하지 않는다고 언급하면서 나를 놀라게했습니다.

제 질문은 C++ STL이 성능과 관련하여 완전히 최적화 되었습니까? 아니면 평균적인 사용자에 대해서만 최적화 되었습니까? C에서 네이티브 배열 주위에 몇 가지 함수를 래핑하는 것이 Vector 나 List보다 빠르다. boost 내에서 성능이 좋은 컨테이너가 있습니까?

이 수업은 99 %의 사용자에게는 충분히 빠르지 만 제 질문은 다른 1 % 내에서의 사용을 목표로합니다.

+0

모든 소프트웨어가 "최적으로 효율적"이라고 말할 수 있는지 의심 스럽습니다. 일반적으로 1 %에 적합한 데이터 별 최적화가 있으며 어셈블리 언어와 프로세서 별 최적화가 있습니다. C++은 매 클럭 사이클 후에 쫓는 것이 아닙니다. –

+5

그것을 측정하십시오. 하나의 큰 문제는 문제와 가능한 최적화가 1 % 범주에 속하는 한 사람이 1 % 필요에있는 다른 사람과 완전히 다를 수 있으며 한 가지 문제에 대해 완전히 최적화 된 코드가 다른 사람과 충돌 할 수 있다는 것입니다 최악의 시나리오 100 % "상상할 수있는 모든 유스 케이스에 완벽하게 최적화 된"것은 존재하지 않습니다. – nos

+1

특정 1 % 사용 사례 시나리오에 대한 대부분의 최적화는 일반적인 사용 사례를 상당히 악화시킵니다. 성능이 좋지 않은 코드에 대해 더 많은 코드가 실행되기 때문에 명령 캐시 스 래싱 이외의 다른 이유로 인해 작업을 수행하고 실제로 성능에 중요한 다른 코드를 느리게 만듭니다. –

답변

6

이 질문은 여러 가지 이유로 "STL은 최적"한다는 어떤 대답을받지 않습니다 : 거기 밖으로 STL의

  1. 있습니다 적어도 대여섯 구현 확실히 몇 가지가있는 다른 것들이 최적화되는 동안 (그러나 다음 항목을보십시오) 최적화되지 않습니다.
  2. 대부분의 최적화는 사용 패턴에 대한 가정을하고 일부 사용 패턴에 대한 비관적 인 평가입니다. 특정 유즈 케이스를 실제로 최적화하려면 무언가를 사용하는 방법에 대한 지식이 필요합니다.
  3. 대부분의 STL 사용자는 하나의 형식으로 구성 요소를 오용하고 일부 적절한 용도는 C++ 2011에서 실제로 지원됩니다 (예 : 로컬 사용자 정의 할당 자 사용).
  4. 사람들이 STL에 대해 이야기 할 때 일반적으로 알고리즘과 함께 제공되는 예제 컨테이너를 참조합니다. 유용 하긴하지만, STL의 핵심은 알고리즘이며 이것들은 최적화 될 가능성이 훨씬 더 큽니다. 결국 STL의 핵심은 사용자가 만든 컨테이너에서 알고리즘을 쉽게 사용할 수 있다는 것입니다. 최적화 컨테이너를 왜 귀찮게합니까? 그러나 항목 1 ~ 3도 알고리즘에 적용됩니다.
  5. STL은 잘 추상화되어 있지만 실제로는 거기에 없습니다. 특히 여러 알고리즘을 결합 할 때 알고리즘을 개별적으로 적용하는 것보다 나은 접근법이 있지만 STL 인터페이스는 실제로이를 지원하지 않습니다.

일반적으로 최적화 된 STL 구현보다 나은 것을 생각해 내기 위해서는 상당한 노력이 필요합니다. 나는 하루에 std::vector<T, A>에 대한 대체 코드를 작성한 사람들로부터 어설 션을 묻는 질문에 일반적인 사용 사례 인 std::vector<T, A> (할당자를 현명하게 사용할 수있는 C++ 2011 버전 참조)이 빠르다고 주장합니다.

2

C++ 03은 복사와 관련하여 상당히 눈부신 성능 문제가 있었지만 C++ 11에서는 이동 의미 및 완벽한 전달 기능으로 해결되었습니다.

스펙은 모든 표준 알고리즘의 복잡성을 정의하므로 모든 구현에서 특정 성능 동작을 기대할 수 있습니다.

사람들이 stdlib 성능에 대해 불평 할 때 종종 작업에 잘못된 도구를 사용하고 알고리즘을 개선해야합니다. C++은 상당히 많은 것을 제공하지만 결코 모든 것을 위해 작동한다는 것을 결코 척하지 않습니다.당신이 컬렉션은 수영장이나 경기장에서 할당 할 수 있도록하려는 경우

:

두 가지 난에 대한 부족 다음 stdlib 컬렉션을 발견했습니다. 할당 자 (심지어 상태 저장)는 모든 경우에 제로 오버 헤드로이를 수행 할만큼 유연하지 않습니다.

또한 때로는 가장 효과적인 구현 방법은 두 개의 컬렉션을 병합하는 것입니다. 예를 들어 캐시의 경우 룩업 및 LRU에 각각 unordered_maplist을 병합 할 수 있습니다. 표준 콜렉션은 이것을 매우 효율적으로 만들지 않습니다.

두 경우 모두 Boost Intrusive가 필요한 기능을 제공합니다.

2

실제로 게시물을 읽고 나면,이 비트는 눈에 띄는 :

"비어, 사용자 정의 할당 자는, 사용자 정의 (사용자 정의 할당 자 포함) 무료 큐 및 목록, 가끔 STL을 잠글 경우에만 동기화 모든 사용자 정의 동기화 클래스입니다 (중대한 라이브러리가있는) 커스텀 관입 수집 (더 자주) "

STL은 여러 작성자를 처리하기 위해 잠금을 비롯한 다른 동기화 프리미티브를 읽는 물론 여러 개의 스레드를 다루기 위해 설정됩니다. 작성자가 사용자 정의 잠금없는 큐 및 목록을 작성한 경우 잠금이있는 순수 STL보다 상당히 많은 성능 향상을 제공 할 수 있습니다. 마찬가지로 사용자 지정 할당자가 거의 예상되지만 기본값 인 std::allocator<T>은 '길의 중간'유형 솔루션으로 알려져 있습니다. 할당 패턴에 따라 메모리 풀이있는 할당자를 사용하면 상당한 속도 향상을 제공 할 수 있습니다.

관련 문제