免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 方兆国
打印 上一主题 下一主题

Java多线程效率-素数计算 [复制链接]

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
11 [报告]
发表于 2013-07-19 13:59 |只看该作者
下面是经过优化的Java多线程运行的结果,线程数从1-39

  1. JavaPure 1Mix线程实现:
  2. Number of primes under 10000000 is  664579
  3. Time taken is 27.441059013 s

  4. JavaPure 2Mix线程实现:
  5. Number of primes under 10000000 is  664579
  6. Time taken is 15.002512164 s

  7. JavaPure 3Mix线程实现:
  8. Number of primes under 10000000 is  664579
  9. Time taken is 14.666844501 s

  10. JavaPure 4Mix线程实现:
  11. Number of primes under 10000000 is  664579
  12. Time taken is 10.94517485 s

  13. JavaPure 5Mix线程实现:
  14. Number of primes under 10000000 is  664579
  15. Time taken is 10.898218614 s

  16. JavaPure 6Mix线程实现:
  17. Number of primes under 10000000 is  664579
  18. Time taken is 10.920853457 s

  19. JavaPure 7Mix线程实现:
  20. Number of primes under 10000000 is  664579
  21. Time taken is 11.044363006 s

  22. JavaPure 8Mix线程实现:
  23. Number of primes under 10000000 is  664579
  24. Time taken is 10.770187893 s

  25. JavaPure 9Mix线程实现:
  26. Number of primes under 10000000 is  664579
  27. Time taken is 10.744386465 s

  28. JavaPure 10Mix线程实现:
  29. Number of primes under 10000000 is  664579
  30. Time taken is 10.678533515 s

  31. JavaPure 11Mix线程实现:
  32. Number of primes under 10000000 is  664579
  33. Time taken is 10.672157318 s

  34. JavaPure 12Mix线程实现:
  35. Number of primes under 10000000 is  664579
  36. Time taken is 10.654416373 s

  37. JavaPure 13Mix线程实现:
  38. Number of primes under 10000000 is  664579
  39. Time taken is 10.673098418 s

  40. JavaPure 14Mix线程实现:
  41. Number of primes under 10000000 is  664579
  42. Time taken is 10.874618216 s

  43. JavaPure 15Mix线程实现:
  44. Number of primes under 10000000 is  664579
  45. Time taken is 10.919771963 s

  46. JavaPure 16Mix线程实现:
  47. Number of primes under 10000000 is  664579
  48. Time taken is 10.735419301 s

  49. JavaPure 17Mix线程实现:
  50. Number of primes under 10000000 is  664579
  51. Time taken is 10.700124453 s

  52. JavaPure 18Mix线程实现:
  53. Number of primes under 10000000 is  664579
  54. Time taken is 10.784798483 s

  55. JavaPure 19Mix线程实现:
  56. Number of primes under 10000000 is  664579
  57. Time taken is 10.903189502 s

  58. JavaPure 20Mix线程实现:
  59. Number of primes under 10000000 is  664579
  60. Time taken is 10.721297829 s

  61. JavaPure 21Mix线程实现:
  62. Number of primes under 10000000 is  664579
  63. Time taken is 10.691479292 s

  64. JavaPure 22Mix线程实现:
  65. Number of primes under 10000000 is  664579
  66. Time taken is 10.649655172 s

  67. JavaPure 23Mix线程实现:
  68. Number of primes under 10000000 is  664579
  69. Time taken is 10.646989932 s

  70. JavaPure 24Mix线程实现:
  71. Number of primes under 10000000 is  664579
  72. Time taken is 10.739623451 s

  73. JavaPure 25Mix线程实现:
  74. Number of primes under 10000000 is  664579
  75. Time taken is 10.714967826 s

  76. JavaPure 26Mix线程实现:
  77. Number of primes under 10000000 is  664579
  78. Time taken is 10.703481252 s

  79. JavaPure 27Mix线程实现:
  80. Number of primes under 10000000 is  664579
  81. Time taken is 10.658188017 s

  82. JavaPure 28Mix线程实现:
  83. Number of primes under 10000000 is  664579
  84. Time taken is 10.696676172 s

  85. JavaPure 29Mix线程实现:
  86. Number of primes under 10000000 is  664579
  87. Time taken is 10.730198419 s

  88. JavaPure 30Mix线程实现:
  89. Number of primes under 10000000 is  664579
  90. Time taken is 10.634209912 s

  91. JavaPure 31Mix线程实现:
  92. Number of primes under 10000000 is  664579
  93. Time taken is 10.650298271 s

  94. JavaPure 32Mix线程实现:
  95. Number of primes under 10000000 is  664579
  96. Time taken is 10.652929998 s

  97. JavaPure 33Mix线程实现:
  98. Number of primes under 10000000 is  664579
  99. Time taken is 10.662882191 s

  100. JavaPure 34Mix线程实现:
  101. Number of primes under 10000000 is  664579
  102. Time taken is 10.700259414 s

  103. JavaPure 35Mix线程实现:
  104. Number of primes under 10000000 is  664579
  105. Time taken is 10.700409772 s

  106. JavaPure 36Mix线程实现:
  107. Number of primes under 10000000 is  664579
  108. Time taken is 10.724275562 s

  109. JavaPure 37Mix线程实现:
  110. Number of primes under 10000000 is  664579
  111. Time taken is 10.705531019 s

  112. JavaPure 38Mix线程实现:
  113. Number of primes under 10000000 is  664579
  114. Time taken is 10.709783176 s

  115. JavaPure 39Mix线程实现:
  116. Number of primes under 10000000 is  664579
  117. Time taken is 10.645592322 s
复制代码

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
12 [报告]
发表于 2013-07-19 14:02 |只看该作者
不过十经过优化的还是没有经过优化的,制造的线程数超过CPU可以执行的线程数后,程序的效率变化不是很大,趋于一个稳定的值,线程之间切换造成的性能损失也不明显


经过优化的类和没有经过优化的运行效率差别不是很大,仅仅不到0.5s左右的差别

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
13 [报告]
发表于 2013-07-19 17:42 |只看该作者
用C语言和C++试了一下这个例子,发现C语言和C++完全玩爆Java

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
14 [报告]
发表于 2013-07-19 17:44 |只看该作者
C语言单线程版
  1. #include <stdio.h>
  2. #include <time.h>

  3. int main(int argc, char *argv[]) {
  4.         time_t start, end;
  5.         time(&start);
  6.         int sum = countPrime(10000000);
  7.         time(&end);
  8.         printf("0-10000000之间有%ld个素数\n", sum);
  9.         printf("程序运行时间%d秒\n", end - start);
  10.         return 0;
  11. }


  12. #include <math.h>

  13. int isPrime(long number) {
  14.         if (1 >= number) {
  15.                 return 0;
  16.         }
  17.         long i;
  18.         for (i = 2; i <= sqrt(number); i++) {
  19.                 if (0 == number % i) {
  20.                         return 0;
  21.                 }
  22.         }
  23.         return 1;
  24. }

  25. int countPrime(long number) {
  26.         int total = 0;
  27.         long i;
  28.         for (i = 2; i < number; i++) {
  29.                 if (isPrime(i)) {
  30.                         total++;
  31.                 }
  32.         }
  33.         return total;
  34. }
复制代码
运行结果
  1. 0-10000000之间有664579个素数
  2. 程序运行时间9秒
复制代码

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
15 [报告]
发表于 2013-07-19 17:45 |只看该作者
本帖最后由 方兆国 于 2013-07-19 17:46 编辑
  1. #include <stdio.h>
  2. #include <time.h>

  3. int main(int argc, char *argv[]) {
  4.         time_t start, end;
  5.         time(&start);
  6.         int sum = countPrime(10000000);
  7.         time(&end);
  8.         printf("0-10000000之间有%ld个素数\n", sum);
  9.         printf("程序运行时间%d秒\n", end - start);
  10.         return 0;
  11. }



  12. /*
  13. * ConcurrentPrimeFinder.c
  14. *
  15. *  Created on: 2013年7月19日
  16. *      Author: root
  17. */

  18. #include <pthread.h>
  19. #include <stdio.h>
  20. #include <malloc.h>
  21. #include <math.h>

  22. typedef struct {
  23.         int id;
  24.         long lower;
  25.         long upper;
  26.         int total;
  27. } Message;

  28. int flag[4] = { 0, 0, 0, 0 };

  29. int isPrime(long number) {
  30.         if (1 >= number) {
  31.                 return 0;
  32.         }
  33.         long i;
  34.         for (i = 2; i <= sqrt(number); i++) {
  35.                 if (0 == number % i) {
  36.                         return 0;
  37.                 }
  38.         }
  39.         return 1;
  40. }

  41. void *countPrimeInRange(void* mess) {
  42.         long i = 0;
  43.         Message* message = (Message*) mess;
  44.         for (i = message->lower; i < message->upper; i++) {
  45.                 if (isPrime(i)) {
  46.                         message->total++;
  47.                 }
  48.         }
  49.         flag[message->id] = 1;
  50.         return NULL;
  51. }

  52. int countPrime(long number) {
  53.         int total = 0;
  54.         pthread_t thread[4];
  55.         Message *message[4];
  56.         long start = 0, end = 0;
  57.         long range = number / 4;
  58.         int volatile i = 0;
  59.         for (i = 0; i < 4; i++) {
  60.                 message[i] = (Message*) malloc(sizeof(Message));
  61.         }
  62.         for (i = 0; i < 4; i++) {
  63.                 start = range * i;
  64.                 if (i < 3) {
  65.                         end = start + range;
  66.                 } else {
  67.                         end = number;
  68.                 }
  69.                 message[i]->id = i;
  70.                 message[i]->lower = start;
  71.                 message[i]->upper = end;
  72.                 message[i]->total = 0;
  73.                 pthread_create(&thread[i], NULL, countPrimeInRange,
  74.                                 (void*) (message[i]));
  75.         }
  76.         i = 0;
  77.         while (i < 4) {
  78.                 if (1 == flag[i]) {
  79.                         total += message[i]->total;
  80.                         i++;
  81.                 }
  82.         }
  83.         return total;
  84. }
复制代码
运行结果
  1. 0-10000000之间有664579个素数
  2. 程序运行时间5秒
复制代码

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
16 [报告]
发表于 2013-07-19 17:49 |只看该作者
  1. /*
  2. * Main.c
  3. *
  4. *  Created on: 2013年7月19日
  5. *      Author: root
  6. */

  7. #include "ConcurrentPrimeFinder.h"

  8. #include <stdio.h>
  9. #include <time.h>

  10. int main(int argc, char *argv[]) {
  11.         time_t start, end;
  12.         ConcurrentPrimeFinder finder;
  13.         time(&start);
  14.         int sum = finder.countPrime(10000000);
  15.         time(&end);
  16.         printf("0-10000000之间有%ld个素数\n", sum);
  17.         printf("程序运行时间%d秒\n", end - start);
  18.         return 0;
  19. }
复制代码
  1. /*
  2. * ConcurrentPrimeFinder.h
  3. *
  4. *  Created on: 2013年7月19日
  5. *      Author: root
  6. */

  7. #ifndef CONCURRENTPRIMEFINDER_H_
  8. #define CONCURRENTPRIMEFINDER_H_

  9. #include <boost/thread.hpp>
  10. #include <stdio.h>

  11. class ConcurrentPrimeFinder {
  12. public:
  13.         ConcurrentPrimeFinder();
  14.         virtual ~ConcurrentPrimeFinder();
  15.         int countPrime(long number);

  16. private:
  17.         int poolsize;
  18. };

  19. #endif /* CONCURRENTPRIMEFINDER_H_ */
复制代码
  1. /*
  2. * ConcurrentPrimeFinder.cpp
  3. *
  4. *  Created on: 2013年7月19日
  5. *      Author: root
  6. */

  7. #include "ConcurrentPrimeFinder.h"

  8. ConcurrentPrimeFinder::ConcurrentPrimeFinder() {
  9.         poolsize = 4;

  10. }

  11. ConcurrentPrimeFinder::~ConcurrentPrimeFinder() {
  12. }

  13. bool isPrime(long number) {
  14.         if (1 >= number) {
  15.                 return false;
  16.         }
  17.         long i;
  18.         for (i = 2; i <= sqrt(number); i++) {
  19.                 if (0 == number % i) {
  20.                         return false;
  21.                 }
  22.         }
  23.         return true;
  24. }

  25. void countPrimeInRange(long int lower, long int upper, int *total, bool *flag) {
  26.         long i = 0;
  27.         for (i = lower; i < upper; i++) {
  28.                 if (isPrime(i)) {
  29.                         (*total)++;
  30.                 }
  31.         }
  32.         *flag = true;
  33. }

  34. int ConcurrentPrimeFinder::countPrime(long number) {
  35.         using namespace boost;
  36.         int total = 0, sum[4] = { 0 };
  37.         bool flag[4] = { false };
  38.         long start = 0, end = 0;
  39.         long range = number / poolsize;
  40.         int volatile i = 0;
  41.         for (i = 0; i < poolsize; i++) {
  42.                 start = range * i;
  43.                 if (i < poolsize - 1) {
  44.                         end = start + range;
  45.                 } else {
  46.                         end = number;
  47.                 }
  48.                 thread mythread(
  49.                                 bind(&countPrimeInRange, start, end, &(sum[i]), &(flag[i])));
  50.         }
  51.         i = 0;
  52.         while (i < poolsize) {
  53.                 if (flag[i]) {
  54.                         total += sum[i];
  55.                         i++;
  56.                 }
  57.         }
  58.         return total;
  59. }
复制代码
运行结果
  1. 0-10000000之间有664579个素数
  2. 程序运行时间5秒
复制代码

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
17 [报告]
发表于 2013-07-26 15:24 |只看该作者
  1.     0-10000000之间有664579个素数
  2.     程序运行时间5秒
复制代码
5秒

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
18 [报告]
发表于 2013-07-26 18:34 |只看该作者
pitonas 发表于 2013-07-26 15:24
5秒


你的电脑能运行几秒

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
19 [报告]
发表于 2013-07-29 09:44 |只看该作者
方兆国 发表于 2013-07-26 11:34
你的电脑能运行几秒
我感觉我的电脑真是slow啊!   

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
20 [报告]
发表于 2013-07-30 09:01 来自手机 |只看该作者
换台新电脑吧~\(≧▽≦)/~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP