mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-11-19 23:53:48 +08:00
fix img
This commit is contained in:
@@ -285,7 +285,7 @@ wrappedWillStop()
|
||||
<p>然后我们来说说求对数,求对数也是没有指令的。因为对数是指数的逆运算,当然我们可以利用乘法运算一点点尝试。比如计算 log_210,我们可以先尝试 32,再尝试 3.12 等等,一直找到以 2 为底 10 的对数。这其实是个近似算法。</p>
|
||||
<p>另外,在这个问题上聪明的数学家提出了很多近似算法,提升了计算效率。具体这里比较超纲,面试通常只考到有没有求对数的指令,感兴趣的同学可以学习泰勒级数、牛顿迭代法等。</p>
|
||||
<p>比如下面这个泰勒级数可以用来求以<code>e</code>为底的对数,可以进行相似运算。</p>
|
||||
<p><img src="assets/Ciqc1F9twiuAbp_aAAAe6lkGtXY531.png" alt="Drawing 0.png" /></p>
|
||||
<p><img src="assets/Ciqc1F9twiuAbp_aAAAe6lkGtXY531.png" alt="png" /></p>
|
||||
<p><strong>【补充内容】1 位的 CPU 能操作多大的内存空间?</strong></p>
|
||||
<p>在 03 课时程序的执行中,有个问题我讲的不是很明白,在这里我们再讨论一下。</p>
|
||||
<p>之前提到过 32 位机器只能操作小于 32 位的地址总线,这里其实讲的不太清晰,历史上出现过 32 位操作 40 位地址总线的情况。</p>
|
||||
@@ -330,7 +330,7 @@ wrappedWillStop()
|
||||
<h4>05 | 存储器分级 :SSD、内存和 L1 Cache 相比速度差多少倍?</h4>
|
||||
<p><strong>【问题】</strong> 假设有一个二维数组,总共有 1M 个条目,如果我们要遍历这个二维数组,应该逐行遍历还是逐列遍历?</p>
|
||||
<p><strong>【解析】</strong> 二维数组本质还是 1 维数组。只不过进行了脚标运算。比如说一个 N 行 M 列的数组,第 y 行第 x 列的坐标是: x + y*M。因此当行坐标增加时,内存空间是跳跃的。列坐标增加时,内存空间是连续的。</p>
|
||||
<p><img src="assets/Ciqc1F9twnCAUTt4AACDLWAQvC4277.png" alt="Lark20200925-181059.png" /></p>
|
||||
<p><img src="assets/Ciqc1F9twnCAUTt4AACDLWAQvC4277.png" alt="png" /></p>
|
||||
<p>当 CPU 遍历二维数组的时候,会先从 CPU 缓存中取数据。</p>
|
||||
<p>关键因素在于现在的 CPU 设计不是每次读取一个内存地址,而是读取每次读取相邻的多个内存地址(内存速度 200~300 CPU 周期,预读提升效率)。所以这相当于机器和人的约定,如果程序员不按照这个约定,就无法利用预读的优势。</p>
|
||||
<p>另一方面当读取内存地址跳跃较大的时候,会触发内存的页面置换,这个知识在“<strong>模块五:内存管理</strong>”中学习。</p>
|
||||
|
||||
Reference in New Issue
Block a user