std::sort 는 qsort 보다 빠르다 #


  1. 비교 함수의 리턴값
    • <qsort>
      qsort의 비교함수 리턴 값은 int type 입니다.
      그러므로 결과는 3가지 종류이죠

      a < b -> -1
      a > b -> 1
      a = b -> 0

      그러므로 적어두 2번을 비교 해야 합니다.


    • <sort>
      sort의 비교함수 리턴 값은 bool type이입니다.
      그러므로 1번만 비교 하면 되는것이져

         template <typename T>
         bool comp(const T &a, const T &b) {
             return a < b  // a가 b보다 작으면 참 아니면 거짓 
         }
      


  2. 비교함수의 inlining
    • <qsort>
      비교자를 함수로 밖에 못넘기기때문에 함수호출로 인한 오버헤드는 불가피 합니다.
      만약 비교함수를 inline으로 선언해도 함수 포인터를 사용 하므로 무시됩니다.
      (inline및 register는 힌트이기 때문에 컴파일러의 사정에 따라 무시될수 있습니다. 야속하게도 ...)

    • <sort>
      비교함수및 sort함수가 template으로 구성되어서 함수및 함수객체(functor)를 비교자로서 넣을수 있습니다.
      함수로 넣으면 qsort와 같은 오버헤드가 발생 하겠지만 함수객체로 만들면 inlining이 가능하게 만듭니다.



  3. swap 함수의 대입
    • <qsort>
      qsort의 swap함수는 void*로 인수를 받기 때문에 실제 데이터의 크기과 정보를 알수가 없습니다
      그래서 qsort함수의 3번째 인자(데이터의 크기)를 기준으로 객체의 혹은 타입의 크기만큼 전체 복사를
      하게 구현 됩니다.


    • <sort>
      sort함수의 경우는 복사입니다 (template 때문에 가능하져)

         template <typename T>
         void swap(T &a, T &b) {
             T t = a;
             a = b;
             b = a'
         }
      

      그러기 때문에 프로그래머의 데이터 객체의 대입연산자 구현에 따라
      성능은 많이 나아질 여지가 충분한것이져

      거기다가 데이터 자체가 Reference Counting이 된는 객체라면
      그 성능은 월등할것 입니다.

'Dev > C++' 카테고리의 다른 글

STLport 초간단 설치  (1) 2008.05.01
Stroustrup - The real interview  (0) 2008.05.01
최소 완전한 클래스를 만들어라  (0) 2008.05.01
RAII (Resource Acquisition Is Initialization)  (1) 2008.05.01
상속되지 않는것  (0) 2008.05.01

+ Recent posts