当前位置: 首页 > news >正文

沈阳建站培训微信视频网站怎么做的好

沈阳建站培训,微信视频网站怎么做的好,招标网app下载,网站关键词制作使用多线程std::thread发挥多核计算优势#xff08;题目#xff09; 单核无能为力 如果我们的电脑只有一个核#xff0c;那么我们没有什么更好的办法可以让我们的程序更快。 因为这个作业限制了你修改算法函数。你唯一能做的就是利用你电脑的多核。 使用多线程 由于我们…使用多线程std::thread发挥多核计算优势题目 单核无能为力 如果我们的电脑只有一个核那么我们没有什么更好的办法可以让我们的程序更快。 因为这个作业限制了你修改算法函数。你唯一能做的就是利用你电脑的多核。 使用多线程 由于我们的电脑有多个内核所以我们可以创建多线程来把任务“平均”分配给多个核来计算。 这样多个核在“同时”运算的时候就可以加速程序的执行。 多核的细节 关于我们创建多少个线程比较合适多个线程真的可以各自分配到多个核而“同时”运行吗 试一下就知道了。 双线程的效果 我们先用两个线程把任务固定的分配给这两个线程看看完成任务总的执行时间是不是变短了。 代码如下 #include iostream #include cmath//sqrt #include iostream #include iomanip//format output #include chrono #include thread//for faster code #include mutex//for faster code #include sstream//stringstream using namespace std::chrono;//time_piont duration using namespace std;//test helper function begin 测试辅助代码开始 void check_do(bool b, int line __LINE__) {if (b) { cout line: line Pass endl; }else { cout line: line Ohh! not passed!!!!!!!!!!!!!!!!!!!!!!!!!!! endl; exit(0); } } #define check(msg) check_do(msg, __LINE__); //test helper function end 测试辅助代码结束//do not change this function! 不要修改这个函数 //if you want to check a number is prime number or not, you can use this function only. //判断素数只能用这个函数 bool is_number_prime(int n) {if (n 2 || n 3)//prime less than 5{return true;//is prime}if (n % 6 ! 5 n % 6 ! 1)//is not prime{return false;}int cmb (int)std::sqrt(n);for (int i 5; i cmb; i 6){if (n % i 0 || n % (i 2) 0){return false;//is not prime}}return true;//is prime }/*100以内的素数 primes within 1002 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 */ //测试判断素数的函数是否正确 void test_is_prime_number(void) {stringstream ss;for (int i 2; i 100; i){if (is_number_prime(i)){ss i ;}}check(ss.str() 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 ); }//do not change this function! //不要修改此函数 long long test_the_sum_of_all_primes_within(long long scale) {auto start system_clock::now();long long sum 0;for (int n 2; n scale; n) {if (is_number_prime(n)) {sum n;}}cout the sum of all primes from 2~ setw(10) scale is : setw(15) sum , elapled setw(10) static_castlong long(durationdouble, milli(system_clock::now() - start).count()) milliseconds endl;return sum; } //please change this function to let your program faster by use multi core in your CPU. //请重新实现此函数以让你的CPU多核优势得到发挥 //hint: maybe you can use multi thread technology to let your code faster. //提示你可以使用多线程来发挥多核的计算优势从而让你的程序跑的更快 long long faster_test_the_sum_of_all_primes_within(long long scale) {auto start system_clock::now();long long sum 0;std::mutex sum_mutex;auto fun [sum, sum_mutex](long long scaleStart, long long scaleLast) {for (int n scaleStart; n scaleLast; n) {if (is_number_prime(n)) {std::lock_guardstd::mutex lock(sum_mutex);//如果没有多线程互斥访问sum,那么sum的值就可能是错的。sum n;}}};//区间平分这样后面的第二个线程的计算量还是偏大因为都是在处理更大的数字std::thread t1(fun, 2, scale / 2);std::thread t2(fun, scale / 2 1, scale);t1.join();//线程开始运行直到结束t2.join();//线程开始运行直到结束cout the sum of all primes from 2~ setw(10) scale is : setw(15) sum , elapled setw(10) static_castlong long(durationdouble, milli(system_clock::now() - start).count()) milliseconds endl;return sum; } //do not change the code in this function //不要修改此函数中的内容 int main() {test_is_prime_number();long long sum 0;cout base slow version: endl;sum test_the_sum_of_all_primes_within(10000 * 10);check(sum 454396537);sum test_the_sum_of_all_primes_within(10000 * 100);check(sum 37550402023);sum test_the_sum_of_all_primes_within(10000 * 1000);check(sum 3203324994356);sum test_the_sum_of_all_primes_within(10000 * 10000);check(sum 279209790387276);cout endl my faster version: endl;sum faster_test_the_sum_of_all_primes_within(10000 * 10);check(sum 454396537);sum faster_test_the_sum_of_all_primes_within(10000 * 100);check(sum 37550402023);sum faster_test_the_sum_of_all_primes_within(10000 * 1000);check(sum 3203324994356);sum faster_test_the_sum_of_all_primes_within(10000 * 10000);check(sum 279209790387276);cout please enter enter for exit. endl;cin.get();return 0; }运行结果 代码分析 如同代码注释中所说我们把求解区间一分为二后面的一个线程整体上任务还是偏重。因为处理的都是大数据。 但即便这样简单的划分两个线程比一个线程耗时还是大幅度降低的。 在一百万个整数求解的时候时间降低了50% 在一千万个整数求解的时候时间降低了50% 在一亿个整数求解的时候时间降低了30%这是因为后面一个线程的计算量过大两个线程的任务没有起到平分导致的。 可以预见随着数据量的继续增大这种平分区间的算法会导致第二个线程完全占据计算量的大头。这时候会导致这种算法的优势降低甚至减少的时间可以忽略不计。 但是我们的目的达到了。那就是我们已经验证了多线程多核在计算速度上的确是可以完胜单线程的只要我们合理分配计算任务给多个线程。 继续增加线程数量 下面我们把区间3等分创建3个线程看看是不是耗时会不会继续降低 long long faster_test_the_sum_of_all_primes_within(long long scale) {auto start system_clock::now();long long sum 0;std::mutex sum_mutex;auto fun [sum, sum_mutex](long long scaleStart, long long scaleLast) {for (int n scaleStart; n scaleLast; n) {if (is_number_prime(n)) {std::lock_guardstd::mutex lock(sum_mutex);//如果没有多线程互斥访问sum,那么sum的值就可能是错的。sum n;}}};//区间平分这样后面的第二个线程的计算量还是偏大因为都是在处理更大的数字std::thread t1(fun, 2, scale / 3);std::thread t2(fun, scale / 3 1, scale / 3 * 2);std::thread t3(fun, scale / 3 * 2 1, scale);t1.join();//线程开始运行直到结束t2.join();//线程开始运行直到结束t3.join();//线程开始运行直到结束cout the sum of all primes from 2~ setw(10) scale is : setw(15) sum , elapled setw(10) static_castlong long(durationdouble, milli(system_clock::now() - start).count()) milliseconds endl;return sum; }运行输出 代码分析2 正如我们预期时间继续下降尤其是数据量达到一亿的时候总耗时再次变为了原来的一半。 至此多线程多核可以降低计算总时长已经被我们验证完毕。 怎么样你学到了吗 欢迎点赞收藏转发。让其他感兴趣的人也可以看到。
http://www.hkea.cn/news/14501399/

相关文章:

  • 软件公司做网站商城系统源码
  • 做三方网站多少钱网站建设需要哪些项目
  • 网上商城网站开发需求说明书安装wordpress插件目录
  • js搜索网站开发好网站开发策划要求
  • wordpress域名网站搬家网站运营管理的内容有哪些
  • 公司介绍网站平台搭建设计论文石家庄模板建站
  • 招聘网站做专题的目的镇江大港属于哪个区
  • 调研园区网站建设工作做广告图片用什么软件
  • asp模板网站修改佛山网站建设哪家公司好
  • 南宁市建设局网站摄影设计工作室
  • 赣州网站开发制作网站手机app开发
  • 优秀的电子商务网站外贸网站推广计划书
  • 上海 网站建设公司茂名网站建设电话
  • 建设设计项目备案在哪个网站做网站的表情包
  • 无锡网站优化推广方案凡客诚品倒闭了吗知乎
  • 商丘网站建设今天最新体育新闻足球
  • 什么是网站优化主要包括那几个网站建设的客户
  • php与H5做网站山东一级造价师考试时间
  • 建设营销型网站的目的中国建设银行股份有限公司
  • 写网站建设需求百度搜索网站在第一次输入搜索内容后点搜索键没有反应
  • php网站源码带后台青岛网站开发招聘
  • 惠安县建设局网站业务员客户管理软件
  • 招聘网站分析如何做企业营销型网站的内容
  • 建设网站公司专业服务做电影网站赚钱吗
  • 手机网站视频播放模板济南网站地址
  • 网站开发工具概述与比较设计一个网站需要多久
  • 景安网络网站建设教程html登录注册页面代码
  • seo网站优化专员rio门户网站的制作
  • 传媒公司网站设计企业网站 建设过程
  • 好的专业网站建设公司沈阳关键词优化费用