调查问卷:测试你对多核多线程的认知程度

测试你对多核多线程的认知程度

        目前,多核多线程编程已经成为一种趋势,但大部分程序员还没有从串行程序的思维中走出来。即使有些人对多核多线程的概念有所了解,但也是一知半解,写起多核多线程程序来总是束手束脚。         据Intel预测,到2013年CPU将达到256核。掐指头算一算,也就是还有5年的时间,但留给我们程序员的时间却很少了。这不是危言耸听,现实情况确实如此。如果从现在就开始重视这一问题,不断的学习,并加以积累,相信不久的将来,也许你就比别人多了一次机会。         我曾经对周围的朋友做过一次有趣的调查,调查对象都曾有过多线程编码经验,以此来了解大家对多核与多线程的认知程度。当然不可否认,由于自身知识水平的有限,问卷存在一定的片面性。 样例程序:

  1. #ifdef __cplusplus
  2. extern "C"
  3. {
  4. #endif
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #include <sys/time.h>
  8. #include <pthread.h>
  9. #include <unistd.h>
  10. #define ORANGE_MAX_VALUE       1000000
  11. #define APPLE_MAX_VALUE           100000000
  12. #define MSECOND                         1000000
  13. struct apple
  14. {
  15.     unsigned long long a;
  16.     unsigned long long b;
  17. };
  18. struct orange
  19. {
  20. int a[ORANGE_MAX_VALUE];
  21. int b[ORANGE_MAX_VALUE];
  22. };
  23. int main (int argc, const char * argv[]) {
  24. // insert code here...
  25. struct apple test;
  26. struct orange test1={{0},{0}};
  27.     unsigned long long sum=0,index=0;
  28. struct timeval tpstart,tpend;
  29. float  timeuse; 
  30.     test.a= 0;
  31.     test.b= 0;
  32. /*get start time*/
  33.     gettimeofday(&tpstart,NULL); 
  34. for(sum=0;sum<APPLE_MAX_VALUE;sum++)
  35.     {
  36.         test.a += sum;
  37.         test.b += sum;
  38.     }
  39. for(index=0;index<ORANGE_MAX_VALUE;index++)
  40.     {
  41.         sum=test1.a[index]+test1.b[index];
  42.     }
  43. /*get start time*/
  44.     gettimeofday(&tpend,NULL); 
  45. /*calculate time*/
  46.     timeuse=MSECOND*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec; 
  47.     timeuse/=MSECOND; 
  48.     printf("main thread:%x,Used Time:%f/n",pthread_self(),timeuse); 
  49.     printf("a = %llu,b = %llu,sum=%llu/n",test.a,test.b,sum);
  50. return 0;
  51. }
  52. #ifdef __cplusplus
  53. }
  54. #endif

        假设有一台酷睿2代双核机器,在此机器上对上述程序进行如下优化,您会如何选择呢?         Q1: 您认为样例程序还有优化的空间吗? 如果有,优化后的效率将会提升:         A.  1%~30%              B.  30%~50%              C. 50%~90%              D.  90%以上                  Q2: 如果将样例程序修改为两个线程,一个线程用于计算apple的和,另外一个线程计算orange的和,您认为谁的效率会更高?         A.  两线程              B.  单线程(样例程序)              C. 不确定         Q3:  基于Q2,再将计算apple的线程拆成两个线程,一个线程用于计算apple a的值(加锁访问),另外一个线程计算apple b的值(加锁访问),第三个线程计算orange的和,您认为谁的效率会更高?         A.  两线程        B.  单线程(样例程序)        C. 三线程         D.  不确定         Q4:  基于Q2,在双核CPU系统上,将计算apple的线程绑定到 CPU 0上运行,将计算orange和的线程绑定到 CPU 1上运行,这种方法称为设置CPU亲和力( CPU  Affinity ,也叫 CPU 绑定) 您认为谁的效率会更高?         A.  两线程     B.  单线程(样例程序)    C. 两线程(CPU绑定)     D.  不确定         Q5:  经过分析发现计算orange的和比较快,而计算apple的和比较慢。 基于Q3,将计算apple a的线程和计算orange和的线程绑定到CPU 0上运行,将计算apple b的线程绑定到 CPU 1上运行, 您认为谁的效率会更高?         A.  三线程     B.  单线程(样例程序)    C. 三线程(CPU绑定)     D.  不确定         Q6:  在Q3中,将程序拆成多线程,需要加锁来访问apple a和b的值,但由于他们访问的是数据结构中的不同属性,也可以不加锁, 此时您认为谁的效率会更高?         A.  加锁访问          B.  不加锁访问          C. 不确定          如果有兴趣的读者,想知道问题的答案,可以看看我的拙作《利用多核多线程进行程序优化》。          另外一篇文章还在创作过程中,也是针对本文的样例程序进程一系列的优化,效率最终提升了92%。          欢迎大家拍砖!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏牛客网

阿里一面 京东一面+二面

3714
来自专栏圣杰的专栏

DDD理论学习系列(11)-- 工厂

1.引言 在针对大型的复杂领域进行建模时,聚合、实体和值对象之间的依赖关系可能会变得十分复杂。在某个对象中为了确保其依赖对象的有效实例被创建,需要深入了解对象实...

26710
来自专栏养码场

若你想入职面试阿里系公司,不妨看看这位资深Java的面试经

上上周分享了占小狼面试阿里系的面经文章:《一位资深Java的阿里系公司实战面试经验,套路还是面试官的多》 ,蛮受大家欢迎的。看到大家在社群里的好评与点赞,占小狼...

2032
来自专栏JetpropelledSnake

Python入门之实现简单的购物车功能

Talk is cheap,Let's do this! product_list = [ ['Iphone7 Plus', 6500], ['...

4296
来自专栏Java架构

每个 JavaScript 工程师都应当知道的 10 个面试题以人为本1. 能说出来两种对于 JavaScript 工程师很重要的编程范式么?2. 什么是函数式编程?3. 类继承和原型继承有什么区别?

2936
来自专栏云计算

回归简约——Go语言简介

GoLang(通常缩写为Go)是很多程序员都希望学会使用的最新语言。在本文中,我将介绍go语言的功能、潜力以及是否应该关心Go的发展。

5330
来自专栏思考的代码世界

Python网络数据采集之数据清洗|第06天

1423
来自专栏张善友的专栏

微软在动态语言支持上超越了Java?

当.NET在2000/2001年第一次发布的时候,Java社区认为它仅仅是从语言以及标准库上对Java的一个“克隆”。我们把二者的简单实例代码进行比较以后就可以...

18810
来自专栏张善友的专栏

读《代码不朽:编写可维护软件的10大要则》C# 版

这本书特别针对没有接受过计算机科学或软件工程专业学习的软件开发人员,这类人员除了熟悉所用语言语法和语义之外,很少接受其他专业培训,对软件工程中的一些概念理解欠缺...

6800
来自专栏撸码那些事

【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象

一种重要的抽象实现手法是创建内聚而完整的抽象。抽象未支持相关的方法时,可能会影响抽象的内聚性和完整性。如果抽象只支持部分相关的方法,其使用者就可能不得不自己去实...

1739

扫码关注云+社区

领取腾讯云代金券