今天我在用 python 中的线程计算质数时遇到了问题。它几乎和没有线程一样慢(参见 Question )。
现在我创建了相同的代码,认为使用 pthread 在 C 中不存在 python 问题。
#include <stdio.h>
#include <time.h>
#include <pthread.h>
int isPrime(int number) {
int i;
for (i=2; i<number; i++) {
if (number % i == 0 && i != number) return 0;
}
return 1;
}
void calcPrimeNumbersFromNtoM(int n, int m){
for (int i = n; i <= m; i++) {
if (isPrime(i)) {
//printf("%i\n",i);
}
}
}
void *calcFirstHalf(){
calcPrimeNumbersFromNtoM(1,5000);
return NULL;
}
void *calcSecondHalf(){
calcPrimeNumbersFromNtoM(5001,10000);
return NULL;
}
void calcThreadedPrimenumbers(){
pthread_t t1, t2;
pthread_create(&t1, NULL, calcFirstHalf, NULL);
pthread_create(&t2, NULL, calcSecondHalf, NULL);
//wait for the threads to finish
pthread_join(t1, NULL);
pthread_join(t2, NULL);
}
int main(int argc, const char * argv[])
{
clock_t startNT, endNT,startT, endT;
double cpu_time_usedNT,cpu_time_usedT;
startNT = clock();
calcPrimeNumbersFromNtoM(1, 10000);
endNT = clock();
cpu_time_usedNT = ((double) (endNT - startNT)) / CLOCKS_PER_SEC;
startT = clock();
calcThreadedPrimenumbers();
endT = clock();
cpu_time_usedT = ((double) (endT - startT)) / CLOCKS_PER_SEC;
printf("--------Results-----------\n");
printf("Non threaded took: %f secs\n",cpu_time_usedNT);
printf("Threaded took: %f secs\n",cpu_time_usedT);
return 0;
}
结果是线程再次和非线程一样慢:
--------Results-----------
Non threaded took: 0.020624 secs
Threaded took: 0.027257 secs
这让我很困惑。我的代码有问题吗?线程真的不需要比不使用线程更快吗?如果是,对此的解释是什么?
这是因为操作系统需要调度同一个任务,只分成两部分,导致相同的时间量吗?
也许这很重要:我使用 2.6Ghz Core i5 MacBook 和 OSX 10.9
最佳答案
您的素数计算器是 O(n^2)
。请注意,5000^2 = 25000000
,而 (10,000^2)/2 = 50000000
。
这使得第二个线程成为算法的瓶颈,并且为第一个线程等待了大量时间。
换句话说,与第二个线程相比,第一个线程做的工作很少,因此第一个线程空闲了大部分工作。
关于c - 线程为 "slow"作为非线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23352047/