qsort_b和qsort

时间:2012-12-17 07:47:29

标签: algorithm objective-c-blocks qsort

编写一个程序,在Mac上用C ++演示不同的排序算法。我找到了两个quicksort实现,qsort和qsort_b。

第一个当然是老式的,随处可见的qsort。但是有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;
}

在这里,我看到了巨大的速度差异,是什么导致了所有这些差异。根据我的理解,块用于并行处理,在这种情况下,它不会比函数更快。并行处理没有什么,是吗?

编辑:heapsort_b(),mergesort_b()和qsort_b()例程就像没有_b后缀的相应例程一样,期望compar回调是块指针而不是函数指针。 (FROM BSD MAN PAGE

编辑:速度差异。 DATA为1000000时,qsort以146832 ns完成,qsort_b为127391 ns。考虑到它的速度提高了10%,这是一个相对较大的差异。

编辑:我编辑了代码,可以拥有更大的整数数组。我个人最大的测试结果是1亿个整数,28136278(28s)和23870078(24s)。这对我来说是一个很大的不同。

2 个答案:

答案 0 :(得分:3)

Objective-C Block是一种不同的动物。它可能看起来像MACRO(编译前的替换)和inline functions(告诉编译器&#34;尽力消除函数调用开销&#34; ),但是整体结构与那些结构有很大不同。

阻止一个对象,此外,一个堆栈对象。唯一允许在堆栈中创建的对象(至少没有一些技巧)。

当在堆栈中创建Block对象时,编译器会添加所有局部变量,块变量,它引用的读/写变量的地址以及指向块的可执行代码的指针。因此,即使在开始执行之前,所有内容都可以在没有任何堆栈操作的情况下进行计算。

因此,它不是优化问题,而是Block的属性。它没有堆栈变量的 PUSH POP 的任何函数调用开销。

作为对您的问题的回答,qsort()qsort_b()没有任何算法差异,但是详细的结构,阻止与功能

答案 1 :(得分:2)

看起来像我的优化差异。使用qsort_b,编译器可能会内联比较,而qsort则不会。差异是每次比较函数调用的开销。