首页 > 代码库 > 单线程与多线程排序对比

单线程与多线程排序对比

单线程排序

           【快速排序,使用STL sort函数】


#include <stdio.h>
#include <stdlib.h>

#include <pthread.h>
#include <sys/time.h>

#include <algorithm>
using namespace std;

#define NUMNUM 8000000L
long nums[NUMNUM];  //待排序数组

bool compare(long a, long b)
{
    return a < b;
}

int main()
{
    freopen("back.txt","w",stdout);

    unsigned long   i;
    struct timeval  start, end;
    long long       startusec, endusec;
    double          elapsed;

    srandom(time(NULL));
    for (i = 0; i < NUMNUM; i++)
        nums[i] = random();

    //计时开始
    gettimeofday(&start,NULL);
    sort(nums,nums+NUMNUM,compare); //单线程排序,快速排序
    gettimeofday(&end,NULL);

    //计算用时
    startusec = start.tv_sec * 1000000 + start.tv_usec;
    endusec = end.tv_sec * 1000000 + end.tv_usec;
    elapsed = (double)(endusec - startusec) / 1000000.0;
    printf("sort took %.4f seconds\n", elapsed);

    //查看是否已经排好序
    for (i = 0; i < NUMNUM; i++)
        printf("%ld\n", nums[i]);

    exit(0);
}


耗时:

1、单核,单线程

          sort took 2.2911 seconds

 

2、双核,四线程

           sort took 3.1645 seconds

           sort took 3.1613 seconds


多线程排序

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#include <pthread.h>
#include <sys/time.h>

#include <algorithm>
using namespace std;

#define NTHR   8                /* number of threads */
#define NUMNUM 8000000L         /* number of numbers to sort */
#define TNUM   (NUMNUM/NTHR)    /* number to sort per thread */

long nums[NUMNUM];
long snums[NUMNUM];

pthread_barrier_t b;    //屏障

bool compare(long a, long b)
{
    return a < b;
}

/*
 * Worker thread to sort a portion of the set of numbers.
 */
void *workThread(void *arg)
{
    long    idx = (long)arg;

    sort(&nums[idx],&nums[idx+TNUM],compare);
    pthread_barrier_wait(&b);

    pthread_exit(NULL);
}

/*
 * Merge the results of the individual sorted ranges.
 */
void merge()
{
    long    idx[NTHR];
    long    i, minidx, sidx, num;

    for (i = 0; i < NTHR; i++)
        idx[i] = i * TNUM;

    for (sidx = 0; sidx < NUMNUM; sidx++)
    {
        num = LONG_MAX;
        for (i = 0; i < NTHR; i++)
        {
            if ((idx[i] < (i+1)*TNUM) && (nums[idx[i]] < num))
            {
                num = nums[idx[i]];
                minidx = i;
            }
        }
        snums[sidx] = nums[idx[minidx]];
        idx[minidx]++;
    }
}

int main()
{
    freopen("back.txt","w",stdout);
    unsigned long   i;
    struct timeval  start, end;
    long long       startusec, endusec;
    double          elapsed;
    int             err;
    pthread_t       tid;

    /*
     * Create the initial set of numbers to sort.
     */
    srandom(time(NULL));
    for (i = 0; i < NUMNUM; i++)
        nums[i] = random();

    /*
     * 创建八个线程分别对数组的八个段进行排序
     */
    gettimeofday(&start, NULL);
    pthread_barrier_init(&b, NULL, NTHR+1);
    for (i = 0; i < NTHR; i++)
    {
        err = pthread_create(&tid, NULL,workThread, (void *)(i * TNUM));
        if (err != 0)
        {
            perror("pthread_create");
            return -1;
        }
    }
    pthread_barrier_wait(&b);
    merge();
    gettimeofday(&end, NULL);

    //计算用时
    startusec = start.tv_sec * 1000000 + start.tv_usec;
    endusec = end.tv_sec * 1000000 + end.tv_usec;
    elapsed = (double)(endusec - startusec) / 1000000.0;
    printf("sort took %.4f seconds\n", elapsed);

    for (i = 0; i < NUMNUM; i++)
        printf("%ld\n", snums[i]);
    exit(0);
}

 耗时

1、单核,单线程

     sort took 2.5428 seconds

 

2、双核,四线程CPU

    8个线程

           sort took 1.4124 seconds

           sort took 1.3863 seconds

 

6线程

          sort took 1.3010 seconds

          Sort took 1.2956 seconds

 

 

4个线程

          sort took 1.2626 seconds

          sort took 1.2686 seconds

 

2个线程

          sort took 2.2026 seconds

 


CPU信息

 

 

 

总结:

     可以看到尽管在分别进行排序之后还要有合并(merge)这一步,多线程排序还是要优于单线程排序(在CPU为多核的情况下),而且在CPU为四线程下,使用四个线程对数组进行排序,所耗费时间是最少的!


附:Makefile源码

CC = g++
CPPFLAGS = -Wall -g -pthread

BIN = main
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)

.PHONY: clean all

all: $(BIN)
$(BIN): $(OBJECTS)
    $(CC) $(CPPFLAGS) -o $@ $<

%.o: %.cpp
    $(CC) $(CPPFLAGS) -o $@ -c $<

clean:
    -rm -rf $(BIN) $(OBJECTS)





    

单线程与多线程排序对比