【发布时间】:2014-06-14 15:30:48
【问题描述】:
今天我在 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
【问题讨论】:
-
您的问题可能不足以显示出显着差异。尝试计算更多的素数。
-
从 1 到 1000000 的计算结果为:
--------Results----------- Non threaded took: 137.332219 secs Threaded took: 140.151069 secs所以这不是问题 -
线程不能弥补糟糕的算法。一个不错的公共领域版本在这里:nothings.org/stb/stb_h.html
-
@technosaurus 实际上不需要增加超过 sqrt(number)。
-
@technosaurus 你也可以只做
for (i = 2; i*i <= number; ++i)顺便说一句,我不相信 sqrt 实际上会比这慢。我无法想象在任何给定的现代 CPU 上它需要超过几个周期,所以除非数字非常非常小(大约几十个),否则循环内昂贵的整数除法运算将主导成本
标签: c multithreading algorithm pthreads theory