首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qsort_b和qsort

qsort_b和qsort
EN

Stack Overflow用户
提问于 2012-12-17 15:47:29
回答 2查看 1.4K关注 0票数 5

编写了一个程序,演示了不同的排序算法在C++的Mac。我发现了两个快速排序实现,qsort和qsort_b。

第一个当然是老式的,随处可见的qsort。但是还有qsort_b,它接受一个块而不是一个函数。下面是我的代码:

代码语言:javascript
复制
#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后缀的相应例程,只是比较回调是块指针而不是函数指针。(FROM BSD MAN PAGE)

编辑:速度差异。在数据为1000000的情况下,qsort在146832 ns内完成,qsort_b在127391 ns内完成。考虑到它快了大约10%,这是一个相对较大的差异。

编辑:我已经对代码进行了编辑,使其可以拥有更大的整数数组。我个人最大的测试结果是100000000个整数,28136278 (28秒)对23870078 (24秒)。这对我来说是一个相当大的不同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-24 04:43:57

Objective-C Block是一种不同的动物。它可能看起来像MACRO(编译前的替换)和inline functions(告诉编译器“尽最大努力消除函数调用开销”),但整体结构比这些结构更不同。

Block is an objecta stack object.允许在堆栈中创建的唯一对象(至少没有一些技巧)。

当在堆栈中创建Block对象时,编译器会添加所有局部变量、块变量、它引用的读/写变量的地址以及指向块的可执行代码的指针。因此,即使在开始执行之前,一切都已准备好进行计算,而无需任何堆栈操作。

它没有任何堆栈变量的PUSHPOP的函数调用开销。

作为你的问题的答案,qsort()qsort_b()没有任何算法上的区别,但精心设计的结构,块与函数

票数 4
EN

Stack Overflow用户

发布于 2012-12-17 16:25:10

在我看来,这是优化的区别。在qsort_b中,编译器可能会内联比较,而在qsort中则不会。不同之处在于每次比较时函数调用的开销。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13910164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档