C 中央调度中心给了我一个较慢的执行时间

C 中央调度中心给了我一个较慢的执行时间,c,grand-central-dispatch,C,Grand Central Dispatch,所以,我大约99%肯定我实施了错误的东西,但事情是这样的 我一直在玩GrandCentralDispatch,并做了一个计算MD5哈希的实验。我正在使用i5运行macbook air,因此有4个内核可用。这让我相信,使用Grand Central Dispatch计算散列的速度将快约4倍。但是,出于某种原因,它似乎要慢一些 代码如下 使用GCD 查看Activity Monitor,我可以看到脚本运行时,所有4个内核的最大值都已用完 现在,评论一下调度 #include <stdio.h&

所以,我大约99%肯定我实施了错误的东西,但事情是这样的

我一直在玩GrandCentralDispatch,并做了一个计算MD5哈希的实验。我正在使用i5运行macbook air,因此有4个内核可用。这让我相信,使用Grand Central Dispatch计算散列的速度将快约4倍。但是,出于某种原因,它似乎要慢一些

代码如下

使用GCD

查看Activity Monitor,我可以看到脚本运行时,所有4个内核的最大值都已用完

现在,评论一下调度

#include <stdio.h>
#include <time.h>
#import <CommonCrypto/CommonDigest.h>
#import <dispatch/dispatch.h>

int main (int argc, const char * argv[])
{

    int i,j,k,l,a;
    int num_chars = 4, total;
    clock_t start, end;
    double elap;

    printf("Calculating hashes for %d chars\n", num_chars);

    total = num_chars ^ 64;

    printf("Calculating %d hashes\n", total);

    dispatch_queue_t queue = dispatch_get_global_queue(0,0);
    dispatch_queue_t main = dispatch_get_main_queue();
    dispatch_group_t group = dispatch_group_create();

    start = clock();

   printf("Starting calculation queue\n");
   for(i=0;i<62;i++) {
        for(j=0;j<62;j++) {
            for(k=0;k<62;k++) {
                for(l=0;l<62;l++) {

                    //dispatch_group_async(group, queue, ^{

                        char *letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                        char buffer[10];
                        char out[100];
                        unsigned char hash[16];

                        sprintf(buffer, "%c%c%c%c", letters[i], letters[j], letters[k], letters[l]);
                        CC_MD5(buffer, strlen(buffer), hash); 

                    //});




   }
        }
    }
}

printf("Finished calculation queue\n");
//dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

end = clock();

elap = ((double) end - start) / CLOCKS_PER_SEC;

printf("Time taken  %2f\n", elap);
return 0;
}

查看Activity Monitor,当脚本运行时,它只显示1个核心处于活动状态。

调度中可能完成的工作太少,因此调度所涉及的开销不值得。我会尝试增加每次发送的工作量。我不知道这是否有用,但请尝试:

  • 将分派向上移动几个循环,或者将
    k
    j
    循环包装在分派的块中,以使其执行更多的工作

  • 删除调用
    sprintf
    strlen
    。事实上,该区块可简化为:

    static const char *letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    unsigned char hash[16];
    char buffer[4] = { letters[i], letters[j], letters[k], letters[l] };
    
    CC_MD5(buffer, sizeof buffer, hash);
    
  • #include <stdio.h>
    #include <time.h>
    #import <CommonCrypto/CommonDigest.h>
    #import <dispatch/dispatch.h>
    
    int main (int argc, const char * argv[])
    {
    
        int i,j,k,l,a;
        int num_chars = 4, total;
        clock_t start, end;
        double elap;
    
        printf("Calculating hashes for %d chars\n", num_chars);
    
        total = num_chars ^ 64;
    
        printf("Calculating %d hashes\n", total);
    
        dispatch_queue_t queue = dispatch_get_global_queue(0,0);
        dispatch_queue_t main = dispatch_get_main_queue();
        dispatch_group_t group = dispatch_group_create();
    
        start = clock();
    
       printf("Starting calculation queue\n");
       for(i=0;i<62;i++) {
            for(j=0;j<62;j++) {
                for(k=0;k<62;k++) {
                    for(l=0;l<62;l++) {
    
                        //dispatch_group_async(group, queue, ^{
    
                            char *letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                            char buffer[10];
                            char out[100];
                            unsigned char hash[16];
    
                            sprintf(buffer, "%c%c%c%c", letters[i], letters[j], letters[k], letters[l]);
                            CC_MD5(buffer, strlen(buffer), hash); 
    
                        //});
    
    
    
    
       }
            }
        }
    }
    
    printf("Finished calculation queue\n");
    //dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    end = clock();
    
    elap = ((double) end - start) / CLOCKS_PER_SEC;
    
    printf("Time taken  %2f\n", elap);
    return 0;
    }
    
    gcc -o b.out main.c
    ./b.out
    Calculating hashes for 4 chars
    Calculating 68 hashes
    Starting calculation queue
    Finished calculation queue
    Time taken  7.511273
    
    static const char *letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    unsigned char hash[16];
    char buffer[4] = { letters[i], letters[j], letters[k], letters[l] };
    
    CC_MD5(buffer, sizeof buffer, hash);