【发布时间】:2018-08-24 11:09:59
【问题描述】:
我在这里尝试做的是通过做一个简单重复的操作来比较单线程和多线程的性能。所以我有两个线程将这个随机数 0xde 分配给这个数组,每个线程都占用数组的前半部分和后半部分,而单线程从索引 0 到末尾自行完成相同的工作。
我不明白的是,即使这些子线程只完成了单线程(即主线程)的一半工作,它们却要占用更多时间来完成任务!我不希望它花费一半的时间作为单线程,但我无法想象为什么它会比单线程花费更长的时间。
更令人惊讶的是,如果我将顺序切换为先执行单线程,那么我会得到我想要的结果。我真的可以在这方面使用一些帮助,因为这一切都在我脑海中一团糟。提前致谢!
ps。如果有帮助,我正在使用具有 4 个 ARM 处理器的 Raspberry Pi 3。
这是我得到的结果。
多线程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);
}
【问题讨论】:
-
'#define SIZE 1000000' 开始,添加另一个'0'。
标签: c multithreading performance pthreads