JavaPure 1Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 27.441059013 s
JavaPure 2Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 15.002512164 s
JavaPure 3Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 14.666844501 s
JavaPure 4Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.94517485 s
JavaPure 5Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.898218614 s
JavaPure 6Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.920853457 s
JavaPure 7Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 11.044363006 s
JavaPure 8Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.770187893 s
JavaPure 9Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.744386465 s
JavaPure 10Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.678533515 s
JavaPure 11Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.672157318 s
JavaPure 12Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.654416373 s
JavaPure 13Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.673098418 s
JavaPure 14Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.874618216 s
JavaPure 15Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.919771963 s
JavaPure 16Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.735419301 s
JavaPure 17Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.700124453 s
JavaPure 18Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.784798483 s
JavaPure 19Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.903189502 s
JavaPure 20Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.721297829 s
JavaPure 21Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.691479292 s
JavaPure 22Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.649655172 s
JavaPure 23Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.646989932 s
JavaPure 24Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.739623451 s
JavaPure 25Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.714967826 s
JavaPure 26Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.703481252 s
JavaPure 27Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.658188017 s
JavaPure 28Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.696676172 s
JavaPure 29Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.730198419 s
JavaPure 30Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.634209912 s
JavaPure 31Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.650298271 s
JavaPure 32Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.652929998 s
JavaPure 33Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.662882191 s
JavaPure 34Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.700259414 s
JavaPure 35Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.700409772 s
JavaPure 36Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.724275562 s
JavaPure 37Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.705531019 s
JavaPure 38Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.709783176 s
JavaPure 39Mix线程实现:
Number of primes under 10000000 is664579
Time taken is 10.645592322 s
不过十经过优化的还是没有经过优化的,制造的线程数超过CPU可以执行的线程数后,程序的效率变化不是很大,趋于一个稳定的值,线程之间切换造成的性能损失也不明显
。
经过优化的类和没有经过优化的运行效率差别不是很大,仅仅不到0.5s左右的差别 用C语言和C++试了一下这个例子,发现C语言和C++完全玩爆Java
C语言单线程版#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[]) {
time_t start, end;
time(&start);
int sum = countPrime(10000000);
time(&end);
printf("0-10000000之间有%ld个素数\n", sum);
printf("程序运行时间%d秒\n", end - start);
return 0;
}
#include <math.h>
int isPrime(long number) {
if (1 >= number) {
return 0;
}
long i;
for (i = 2; i <= sqrt(number); i++) {
if (0 == number % i) {
return 0;
}
}
return 1;
}
int countPrime(long number) {
int total = 0;
long i;
for (i = 2; i < number; i++) {
if (isPrime(i)) {
total++;
}
}
return total;
}
运行结果0-10000000之间有664579个素数
程序运行时间9秒
本帖最后由 方兆国 于 2013-07-19 17:46 编辑
#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[]) {
time_t start, end;
time(&start);
int sum = countPrime(10000000);
time(&end);
printf("0-10000000之间有%ld个素数\n", sum);
printf("程序运行时间%d秒\n", end - start);
return 0;
}
/*
* ConcurrentPrimeFinder.c
*
*Created on: 2013年7月19日
* Author: root
*/
#include <pthread.h>
#include <stdio.h>
#include <malloc.h>
#include <math.h>
typedef struct {
int id;
long lower;
long upper;
int total;
} Message;
int flag = { 0, 0, 0, 0 };
int isPrime(long number) {
if (1 >= number) {
return 0;
}
long i;
for (i = 2; i <= sqrt(number); i++) {
if (0 == number % i) {
return 0;
}
}
return 1;
}
void *countPrimeInRange(void* mess) {
long i = 0;
Message* message = (Message*) mess;
for (i = message->lower; i < message->upper; i++) {
if (isPrime(i)) {
message->total++;
}
}
flag = 1;
return NULL;
}
int countPrime(long number) {
int total = 0;
pthread_t thread;
Message *message;
long start = 0, end = 0;
long range = number / 4;
int volatile i = 0;
for (i = 0; i < 4; i++) {
message = (Message*) malloc(sizeof(Message));
}
for (i = 0; i < 4; i++) {
start = range * i;
if (i < 3) {
end = start + range;
} else {
end = number;
}
message->id = i;
message->lower = start;
message->upper = end;
message->total = 0;
pthread_create(&thread, NULL, countPrimeInRange,
(void*) (message));
}
i = 0;
while (i < 4) {
if (1 == flag) {
total += message->total;
i++;
}
}
return total;
}
运行结果0-10000000之间有664579个素数
程序运行时间5秒
/*
* Main.c
*
*Created on: 2013年7月19日
* Author: root
*/
#include "ConcurrentPrimeFinder.h"
#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[]) {
time_t start, end;
ConcurrentPrimeFinder finder;
time(&start);
int sum = finder.countPrime(10000000);
time(&end);
printf("0-10000000之间有%ld个素数\n", sum);
printf("程序运行时间%d秒\n", end - start);
return 0;
}
/*
* ConcurrentPrimeFinder.h
*
*Created on: 2013年7月19日
* Author: root
*/
#ifndef CONCURRENTPRIMEFINDER_H_
#define CONCURRENTPRIMEFINDER_H_
#include <boost/thread.hpp>
#include <stdio.h>
class ConcurrentPrimeFinder {
public:
ConcurrentPrimeFinder();
virtual ~ConcurrentPrimeFinder();
int countPrime(long number);
private:
int poolsize;
};
#endif /* CONCURRENTPRIMEFINDER_H_ */
/*
* ConcurrentPrimeFinder.cpp
*
*Created on: 2013年7月19日
* Author: root
*/
#include "ConcurrentPrimeFinder.h"
ConcurrentPrimeFinder::ConcurrentPrimeFinder() {
poolsize = 4;
}
ConcurrentPrimeFinder::~ConcurrentPrimeFinder() {
}
bool isPrime(long number) {
if (1 >= number) {
return false;
}
long i;
for (i = 2; i <= sqrt(number); i++) {
if (0 == number % i) {
return false;
}
}
return true;
}
void countPrimeInRange(long int lower, long int upper, int *total, bool *flag) {
long i = 0;
for (i = lower; i < upper; i++) {
if (isPrime(i)) {
(*total)++;
}
}
*flag = true;
}
int ConcurrentPrimeFinder::countPrime(long number) {
using namespace boost;
int total = 0, sum = { 0 };
bool flag = { false };
long start = 0, end = 0;
long range = number / poolsize;
int volatile i = 0;
for (i = 0; i < poolsize; i++) {
start = range * i;
if (i < poolsize - 1) {
end = start + range;
} else {
end = number;
}
thread mythread(
bind(&countPrimeInRange, start, end, &(sum), &(flag)));
}
i = 0;
while (i < poolsize) {
if (flag) {
total += sum;
i++;
}
}
return total;
}
运行结果0-10000000之间有664579个素数
程序运行时间5秒
0-10000000之间有664579个素数
程序运行时间5秒 5秒:victory: pitonas 发表于 2013-07-26 15:24 static/image/common/back.gif
5秒
你的电脑能运行几秒 方兆国 发表于 2013-07-26 11:34 static/image/common/back.gif
你的电脑能运行几秒我感觉我的电脑真是slow啊! :emn16::emn16: 换台新电脑吧~\(≧▽≦)/~
页:
1
[2]