03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?
03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?
讲述:徐文浩
时长12:43大小11.62M
什么是性能?时间的倒数
计算机的计时单位:CPU 时钟
总结延伸
课后思考
赞 152
提建议
精选留言(167)
- 活的潇洒置顶2019-04-30运行的代码是: [root@nfs ~]# time seq 1000000 | wc -l 1000000 real 0m0.058s user 0m0.047s sys 0m0.044s 为什么user + sys 运行出来会比real time 多呢展开
作者回复: 因为你在一台多核或者多cpu的机器上运行,seq和wc命令会分配到两个cpu上,user和sys是两个cpu时间相加的,而real只是现实时钟里走过的时间,极端情况下user+sys可以到达real的两倍
共 5 条评论290 - 趁早置顶2019-04-29time seq 100000 | wc -l 100000 real 0m0.006s user 0m0.003s sys 0m0.004s 我也是类似的问题,操作系统centos7.4,物理环境阿里云ecs cpu 信息 Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz展开
作者回复: 我知道原因了,这个的确是因为“并行原因”的运行的。虽然seq和wc这两个命令都是单线程运行的,但是这两个命令在多核cpu运行的情况下,会分别分配到两个不同的cpu,于是user和sys的时间都是两个cpu上运行的时间之和,就可能超过real的时间。你可以这样来快速验证 运行 time seq 100000000 | wc -l & 让这个命令多跑一会儿,并且在后台运行。 然后利用 top 命令看不同进程的cpu占用情况,你会在top的前几行里看到seq和wc的cpu占用都接近100,实际是各被分配到了一个不同的cpu执行。 我写文稿测试的时候开了一个1u的最小的虚拟机,只有一个cpu所以不会遇到这个问题。
共 5 条评论73 - 极客雷2019-05-13搞明白这个事实就好了,一个程序对应多条语句,一条编程语句可能对应多条指令,一条CPU指令可能需要多个CPU周期才能完成。
作者回复: 👍
共 2 条评论182 - Only now2019-04-30猜测,跑分程序载入后,停止操作系统的线程调度或者给最高优先级和响应中断,全力跑跑分。暂时提高时钟频率,停止温度检测和低级中断,这样CPU就全力在跑测试程序了吧。 没做过弊,猜测
作者回复: 👍监测到跑分程序在运行进行超频或者过热也不降频是一种常见的作弊手段
共 2 条评论88 - 易儿易2019-05-01老师,针对“主频越高,意味着这个表走得越快,我们的 CPU 也就“被逼”着走得越快。”这句话我有一点儿疑惑: 时钟周期时间为1/2.8G 秒,代表CPU最细粒度时间,即一次晶振的时间 这个周期时间和指令执行的耗时有直接关系吗?我说的直接关系指的是比如“一次晶振时间可以固定完成n个CPU(最简单的)指令”这种,如果有关系的话,那可以很明确的得出这个表走的快,CPU执行就快,毕竟单位时间内执行的指令数固定,通过降低单位时间就可以提升效率。 但是文中好像并没有提到这个直接关系,所有我可不可以这么去理解,晶振时间变短后,CPU调度指令的周期变短频次变高,使得上一个指令执行完毕到下一个指令被调动期间的等待时间变短,从而提升了CPU的利用率。好比一个监工增加了抬头看监控视频的频率,一旦有员工手停下来能立马给安排任务,主频低的话,可能员工休息半天才会被发现。另外,这种情况下,似乎主频提升的倍率并不能与性能提升带来1:1的效益。 1.晶振时间与CPU执行固定指令耗时成正比 2.晶振时间降低使CPU调度指令的周期变短频次变高 这两种哪一种对呢?还是都错?请指点~ —————————— 又看了一遍,感觉刚刚对CPI的概念误读了,其实晶振时间是固定处理一个cpu简单指令的,CPI的平均时间是用来描述复杂指令的,指令数同样也是,其实整个公式如果用用简单指令来描述可能更容易理解一些展开
作者回复: 易儿易同学你好,这个问题提的得非常好,你学得和思考得都很仔细深入。1的理解更准确一点,我们为了理解简单可以暂且认为就是晶振在触发一条一条电路变化指令,就好像你拨算牌盘的节奏一样。算盘拨得快,珠算就算得快。结果就是一条简单的指令需要的事件就和一个时钟周期一样,实际这个问题要比这样一句话复杂很多。一方面,其实时钟周期应该是放下最复杂的一条指令的时间长度。我们是通过流水线来提升cpi的。我会在讲解cpu的部分更深入讲解始终信号和计数器,让大家能够理解cpu到底是怎么回事儿。
共 4 条评论60 - 霹雳2019-05-02用户态运行和系统内核运行这两个什么区别呢
作者回复: 霹雳同学你好, 关于用户态运行和系统内核运行,如果要深入了解的话,可以去看看刘超老师的 《趣谈Linux操作系统》。 如果简单讲一下的话,就是我们的程序实际在操作系统里面是运行在“保护模式”下的,很多指令我们的应用程序并没有权限去操作执行,需要切换到内核态,由操作系统去执行,比如说操作硬件的时候。
48 - humor2019-04-30对于文中的CPU钟表时间间隔和时钟周期还是没有理解很清楚,时间间隔和时钟周期是互为倒数的关系吗?就是CPU主频是一个单位时间,而时钟周期就是这个单位时间被分成主频(2.8G)等份的一份吗?
作者回复: humor同学你好,如果我没理解错你的意思的话,你的理解是对的。CPU主频是一个频率(frequency),频率的单位叫做赫兹(Hz)。意思是一秒内这个事情可以发生多少次。主频2.8GHz就代表一秒内晶振振动了2.8G次,这里的G其实就是10亿次,也就是28亿次。那么我们的时钟周期时间就是1/28亿秒。
共 2 条评论38 - changing2019-04-29运行的代码是 time seq 100000 | wc -l real 0m0.033s user 0m0.030s sys 0m0.005s 为什么user + sys 运行出来会比real time 多呢
作者回复: changing同学你好,一般情况下,如果user+sys比real大,甚至光光user比real大的情况出现,都是因为对应的程序被多个进程或者多个线程并行执行了,也很常见。不过你遇到的这个问题的确有些奇怪,我要研究一下,因为linux下的seq和wc这些命令按照我的理解都是单线程运行的。 能告诉我你使用的硬件和操作系统么?
36 - KR®2019-04-30又重刷了一遍前四讲, 徐老师讲得又清惜又易懂,老师备课花了不少心血吧… 现在等待更新的心情就像追了一部超高分剧等更一样!!辛苦徐老师备课喇^^
作者回复: 谢谢支持😊
27 - 安之若素,岁月静好2019-05-02跑分作弊个人猜测:当检测到跑分程序运行的时候,降低系统调用,提高跑分程序优先级。关闭热管理系统(防止过热关核降频),手机CPU核心全开,超频到最高等。不顾一切,全心全意为跑分程序服务
作者回复: 👍说得八九不离十
共 3 条评论23 - ruanxw2019-08-21老师,CPU 8核 16核代表啥意思我还是没怎么理解。
作者回复: ruanxw同学, 你好,8核你可以认为就是8个CPU,只不过放在了一块芯片上,然后通过电路再连接在一起,可以让操作系统统一管理调度。
17 - 大飞守角2019-05-12看到cpu指令这一块,我想起了精简指令和复杂指令,执行同样的任务,精简指令需要的条数少,复杂指令需要的多,是不是说同样的任务,放在同样频率的精简指令cpu和复杂指令cpu上执行,精简指令cpu的执行效率高?
作者回复: 秦晋同学,某种程度上来说,你理解反了。精简指令集意味着cpu从硬件或者电路层面支持的指令数比较少。这个意味着很多复杂的操作需要执行更多的指令而不是更少的。 执行效率这个问题更复杂一些,精简指令也许更容易提高频率或者利用流水线等等,只能说具体问题具体分析。现在更多地是出于一个“混合”的状态
18 - imicode2019-05-141. 打卡总结: 性能的CPU有两个重要的指标,响应时间和吞吐率。在这两个重要指标下,要提升性能,核心是优化CPU的执行时间,而CPU执行时间公式如下: 程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time 2. 关于作弊 要提高跑分,无非是优化CPU的执行时间,可以从两个方面入手,一是提高CPI,可以采取超频运行的模式;二是优化指令数,单独针对特定的CPU进行代码优化。展开
作者回复: 👍
共 7 条评论16 - Guarantee2019-05-17老师,单个CPU的主频是有上限的,所以出现了多核CPU进行计算,为了提高更多的计算,是不是就要运用分布式计算这个技术。
作者回复: 是的
11 - Geek_63ad862019-05-15老师我尝试了用自己的话理解一下您讲授的内容: 度量一个程序运行的时间T需要知道该程序有几条指令(n),每一个指令平均需要几个基本操作才能执行完毕(k),cpu执行一个基本操作的耗时(t),从而T = n*k*t,t作为SE一般是无法提升的,除非改进硬件,所以缩短运行时间可能主要还是从n、k入手。不知道这样理解是否正确? 此外,跑分“作弊”我猜测是利用软件暂时提升手机性能,但是性能只是衡量手机的一个维度,在不同使用场景下手机的流畅性和稳定性也是需要考虑的,“作弊”跑分的参考价值不大,对于十分注重跑分的用户作弊的跑分可能会对他们产生很强的欺骗性。展开
作者回复: 👍你的理解是正确的
10 - 潜默闻雨2019-04-29徐老师,程序的cpu执行时间是不是由很多cpu时间片组成,而cpu并不知道自己在执行哪个程序的指令,只是按时间片去按顺序执行指令,不知道这样理解对不对?非科班的转行人士,正在努力补基础😅。。。
作者回复: 潜默闻雨同学你好,这个理解没错。到了cpu层面只有一条条机器码的指令,它并不关心这个指令具体是从哪个程序里来的。
11 - 彩色的沙漠2019-05-14老师您好,原文中有关于主频的描述如下: 这里的 2.8GHz 就是电脑的主频(Frequency/Clock Rate)。这个 2.8GHz,我们可以先粗浅地认为,CPU 在 1 秒时间内,可以执行的简单指令的数量是 2.8G 条。 如果想要更准确一点描述,这个 2.8GHz 就代表,我们 CPU 的一个“钟表”能够识别出来的最小的时间间隔。 问题是"这个 2.8GHz 就代表,我们 CPU 的一个“钟表”能够识别出来的最小的时间间隔。"不应该是主频的倒数是最小的时间间隔吗?展开
作者回复: 彩色的沙漠同学你好,你的描述的确更加准确一些
5 - Ant2019-05-06时钟周期是啥意思
作者回复: Ant同学你好,时钟周期,是CPU内部通过一个反馈电路形成的一个“晶振”的产生反复的0/1电路信号的一个频率,在17讲讲解CPU的时候,我们还会深入讲解一下时钟周期是怎么回事儿。
5 - txhh2019-04-30time seq 100000 | wc -l 100000 real 0m0.003s user 0m0.003s sys 0m0.003s 虚拟机上的CentOS 7.5 i7 6700HQ展开
作者回复: 我知道原因了,这个的确是因为“并行原因”的运行的。虽然seq和wc这两个命令都是单线程运行的,但是这两个命令在多核cpu运行的情况下,会分别分配到两个不同的cpu,于是user和sys的时间都是两个cpu上运行的时间之和,就可能超过real的时间。你可以这样来快速验证 运行 time seq 100000000 | wc -l & 让这个命令多跑一会儿,并且在后台运行。 然后利用 top 命令看不同进程的cpu占用情况,你会在top的前几行里看到seq和wc的cpu占用都接近100,实际是各被分配到了一个不同的cpu执行。 我写文稿测试的时候开了一个1u的最小的虚拟机,只有一个cpu所以不会遇到这个问题。
5 - 一步2019-04-29有个疑问,现在CPU的时钟周期是不是都是一定的,CPU的频率是根据CPU的处理能力计算出来的。 但是现在说的超频是缩短的CPU时钟周期,让在一个更短的周期内处理相同的指令数,但是这个缩短的范围怎么定义的?会不会超过CPU的处理极限,如果每个CPU的时钟周期不一致,那怎么相互比较CPU的性能差异 希望老师解答展开
作者回复: 一步同学你好,超频也会设定一个超频后的cpu主频的,比如2.8GHz超频到3.2GHz。 的确有可能会超出极限,这样也可能跑着跑着cpu就崩溃了,所以正常使用并不推荐超频。 cpu的时钟周期就是不一致的,同样指令集和体系结构的cpu,可以认为频率越高性能就越好。
6