把二维遍历也换算成步长

逐列遍历一个 8×8 数组,相邻两次访问的下标差多少?把这个差和块大小比一比。

开始练习 →

⚠️ 用访问次数当指标会得出反结论

用「访问次数」和「装载次数」两个指标,各评一次步长 4 比步长 1「好多少倍」。⚠️ 两个指标会给出完全不同的结论。

开始练习 →

写缓存友好的代码,第一条是什么

要让代码对缓存友好,最要紧的一条是【0】。

开始练习 →

把两趟合成一趟为什么有用

原来要把数组扫两遍,改成一遍里把两件事都做完。这样做能省下【0】。

开始练习 →

扫两遍和扫一遍,搬了几趟

运行下面这段程序,填写它打印出来的结果。 BLK = 4 def loads(idxs): cur = -1 n = 0 for i in idxs: b = i // BLK if

开始练习 →

一次多用一点

运行下面这段程序,填写它打印出来的结果。 BLK = 4 def loads(idxs): cur = -1 n = 0 for i in idxs: b = i // BLK if

开始练习 →

把两趟合成一趟

原来一趟求和、一趟求最大值。改成一趟里两件事都做,验证结果不变,并算出搬运省了几趟。

开始练习 →

把逐列改成逐行

把一段逐列遍历的求和改成逐行,验证结果一致,并给出两者装载次数。

开始练习 →

⚠️ 缓存友好不等于代码更短

把逐行求和写成一行 sum,和手写双层循环比一比:装载次数和结果各是多少。

开始练习 →

⚠️ 改了顺序却改错了下标

把两层循环换了位置,却顺手把 m[i][j] 也改成了 m[j][i]。⚠️ 在这个数组上它照样跑得通——把两个结果都打出来。

开始练习 →