2012-12-17 4 views
5

Mac의 C++에서 다른 정렬 알고리즘을 보여주는 프로그램 작성. qsort와 qsort_b라는 두 가지 quicksort 구현을 발견했습니다.qsort_b 및 qsort

첫 번째 것은 당연히 구식이며 모든 곳에서 볼 수 있습니다. 그러나 qsort_b가 있습니다. qsort_b는 함수가 아닌 블록을 사용합니다. 내 코드는 다음과 같습니다.

#include <cstdlib> 
#include <cstdio> 
#include <iostream> 
#include <cstdio> 
#include <ctime> 

#define DATA 1000000 

using namespace std; 

int compare(const void* a, const void* b) 
{ 
    return *(int*)a - *(int*)b; 
} 

int main(int argc, char *argv[]) 
{ 
    int* array = new int[DATA]; 

    srand(time(0)); 

    for (int i = 0 ; i < DATA ; ++ i) 
    { 
     array[i] = rand() % 2147483647; 
    } 

    clock_t begin = clock(); 

    qsort(array, DATA, sizeof(array[0]), compare); 
    //qsort_b(array, DATA, sizeof(array[0]), ^(const void* a, const void* b) { return *(int*)a - *(int*)b; }); 

    clock_t end = clock(); 

    cout << "Time it takes to sort " << DATA << " integers with quicksort: " << end - begin; 
} 

여기에는 큰 차이점이 있습니다. 그 차이점은 무엇입니까? 필자의 이해를 돕기 위해 블록은 병렬 처리를위한 것으로,이 경우 함수보다 빠르지는 않습니다. 평행 과정에는 아무 것도 없지, 그렇지?

EDIT : heapsort_b(), mergesort_b() 및 qsort_b() 루틴은 _b 접미사가없는 해당 루틴과 유사하므로 compar 콜백이 함수 포인터 대신 블록 포인터임을 기대합니다. (FROM BSD MAN PAGE)

편집 : 속도 차이. DATA가 1000000 인 경우 qsort는 qsort_b와 함께 146832 ns에서 127391 ns로 완료됩니다. 상대적으로 큰 차이점은 약 10 % 빨라진다는 점입니다.

편집 : 더 큰 정수 배열을 가질 수 있도록 코드를 편집했습니다. 개인적으로 가장 큰 테스트 결과는 28136278 (28 초) 대 23870078 (24 초)의 정수 100000000 개입니다. 나에게는 상당히 큰 차이가있다.

+0

"큰 속도 차이" –

+0

@ KarthikT 측정 단위로는 확실하지 않지만 나노초라고 생각합니다. qsort의 경우 146832이고 qsort_b의 경우 127391입니다. DATA가 1000000 일 때 –

+0

저는 더 큰 데이터 인 100000000 개의 정수로 테스트했습니다. 28136278 (28 초) 대 23870078 (24 초)입니다. 나에게는 상당히 큰 차이가있다. –

답변

3

Objective-C Block은 다른 종류의 동물입니다. MACRO (컴파일하기 전에 대체) 및 inline functions (컴파일러에서 "함수 호출 오버 헤드를 제거하기 위해 최선을 다합니다")와 같을 수 있지만 전반적인 구조는 해당 구조와 훨씬 다릅니다.

블록 객체이고, 또한, 스택 객체. 적어도 일부 트릭없이 스택에서 만들 수있는 유일한 개체입니다.

스택에 Block 개체가 만들어지면 컴파일러는 모든 로컬 변수, 블록 변수, 참조하는 읽기/쓰기 변수의 주소 및 블록의 실행 코드에 대한 포인터를 추가합니다. 따라서 실행을 시작하기 전에 모든 스택 작업없이 모든 것이 계산을 위해 준비됩니다.

따라서 최적화 문제는 아니며 Block의 속성입니다. 의 함수 호출 오버 헤드가 없습니다. PUSHPOP 스택 변수입니다. 귀하의 질문에, qsort()qsort_b() 어떤 알고리즘 차이가 없습니다에 대한 답변,하지만 정성 들여 구조, 기능블록으로

.

2

나에게 최적화 차이가있는 것처럼 보입니다. qsort_b에서는 컴파일러가 비교를 인라인하는 반면 qsort에서는 그렇지 않습니다. 차이점은 비교 당 함수 호출의 오버 헤드입니다.

+0

정확해야합니다. 내가 틀렸다면이 특정 상황에서 블럭이 인라인 함수와 같다는 것을 정정하십시오. 그리고 인라인 함수는 함수보다 빠릅니다. (http://stackoverflow.com/questions/4016061/why-is-inlining-considered-faster-than-a-function-call) –

+0

@ ShaneHsu 내가 읽은 것 이외의이 "블록"에 대해서는 아무것도 모른다. http://en.wikipedia.org/wiki/Blocks_(C_language_extension)에서 컴파일러가 생성하는 코드의 종류에 대해서는 언급 할 수 없습니다. 진행 상황을 실제로 이해하려면 컴파일러 명령 행 스위치를 추가하여 두 경우 모두 asm 소스 파일 (오브젝트 파일 대신)을 생성하고 비교하십시오. 또 다른 실험은 최적화를 해제 한 상태에서 두 버전을 모두 시도한 다음 최대 값까지 크랭크 업하고 상대적인 성능에 어떤 영향을 미치는지 확인하는 것입니다. – hyde

+0

나중에 실험 해 보겠습니다. 감사! –