【发布时间】:2018-08-03 11:34:06
【问题描述】:
假设有一排 10 个灯泡。它们的状态可以是 ON (1) 或 OFF(0)。
这可以用一个数组来表示。
states = [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]
或作为 10 位数字。
states = 1011010010
更新状态(在列表中设置值):
对于数组来说是
states[0] = 1
对于位,它将使用位掩码
states = states | 10000000
类似的操作将用于清除位等。
这些操作中哪个更快?哪些情况下应该使用数组,位也应该使用?
我已经看到某些引擎(例如国际象棋/跳棋引擎)使用位串来存储棋盘状态(1 = 方块上的棋子,0 = 方块上的棋子)。有些还使用数组。如果可能,也可以考虑这种情况。
【问题讨论】:
-
使用位掩码应该更快,因为对简单整数执行操作比执行数组访问算术更快。您必须小心整数类型可以包含您的所有位。
-
我在@Adder 评论上 +1,但想指出任何可以包含在机器寄存器中的东西都会更快。然而;如果状态列表超出该边界,您将需要执行一次提取(可能在缓存中,也可能不在缓存中),这会降低性能。
-
没有一般的答案。使用数组可以锻炼内存子系统,使用位可以让处理器内核做更多的工作。机器的不同部件,唯一确定的方法就是尝试一下。
标签: arrays performance bit-manipulation programming-languages