把二维遍历也换算成步长
逐列遍历一个 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]。⚠️ 在这个数组上它照样跑得通——把两个结果都打出来。