gpt4 book ai didi

c - C 中的单线程与 pthread 的多线程

转载 作者:行者123 更新时间:2023-12-04 12:03:52 24 4
gpt4 key购买 nike

我在这里想做的是通过做一个简单且重复的操作来比较单线程和多线程的性能。因此,我有两个线程将此随机数 0xde 分配给该数组,每个线程获取数组的前半部分和后半部分,而单线程本身从索引 0 到末尾执行相同的工作。

我不明白的是,尽管这些子线程完成了单线程(即主线程)一半的工作,但它们却花费了更多的时间来完成任务!我不希望它花费单线程一半的时间,但我无法想象为什么它会比单线程花费更长的时间。

更令人惊讶的是,如果我先切换顺序以进行单线程,那么我就会得到我想要的结果。我真的需要一些帮助,因为这在我的脑子里都是一团糟。提前致谢!

ps。我正在使用 Raspberry Pi 3,它有 4 个 ARM 处理器(如果有帮助的话)。 这是我得到的结果。 多线程1:46毫秒
多线程2:50毫秒
单线程:34 毫秒

#include <pthread.h>
#include <stdio.h>
#include <time.h>
#define SIZE 1000000

clock_t difference = 0;
clock_t difference1 = 0;
clock_t difference2 = 0;

void *substitute1(void *operand)
{
int *arr = (int *)operand;
int i=0;
clock_t before1 = clock();

for(i=0;i<(SIZE/2);i++)
{
arr[i] = 0x00de;
}
difference1 = clock() - before1;
return NULL;
}


void *substitute2(void *operand)
{
int *arr = (int *)operand;
int i=0;
clock_t before2 = clock();

for(i=(SIZE/2);i<SIZE;i++)
{
arr[i] = 0x00de;
}
difference2 = clock() - before2;
return NULL;
}

void single_thread(int *arr);

int main(void)
{
int arr[SIZE];
int test[SIZE];
int msec1, msec2;


// declare thread variables
pthread_t thread1;
pthread_t thread2;

// create threads
pthread_create(&thread1, NULL, substitute1, arr);
pthread_create(&thread2, NULL, substitute2, arr);

// wait untill the two threads do all their work
while(arr[SIZE/2 - 1] != 0x00de) {/*printf("arr[%d] = %x\n", SIZE/2 - 1, arr[SIZE/2 -1]);*/};
while(arr[SIZE-1] != 0x00de) {/*printf("arr[%d] = %x\n", SIZE-1, arr[SIZE-1]);*/};

// and then join
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);

// convert clocks to milliseconds
msec1 = difference1 * 1000 / CLOCKS_PER_SEC;
msec2 = difference2 * 1000 / CLOCKS_PER_SEC;

printf("Multithreading1 : %d ms\n", msec1);
printf("Mulththreading2 : %d ms\n", msec2);

// here's the single-threading
single_thread(test);

return 0;
}

void single_thread(int *arr)
{
int msec = 0, i = 0;

// declare initial clock
clock_t single_before = clock();

for(i=0;i<SIZE;i++)
{
arr[i] = 0x00de;
}

difference = clock() - single_before;

// convert clocks to milliseconds
msec = difference * 1000 / CLOCKS_PER_SEC;
printf("Singlethreading : %d ms\n", msec);

}

最佳答案

多线程程序的性能改进来自于在多个处理单元之间分配工作负载。因此,您的程序必须使用足够的处理器来证明分配工作负载的合理性。然而,您在这里所做的只是将数据写入内存,没有进行任何处理,因此您受到内存访问的约束,如here所述。 .

关于c - C 中的单线程与 pthread 的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com