在 C# 中保留状态标志(低于 32 项)的最有效方法

Most effecient way to keep status flags (under 32 items) in c#

假设我们正在定义一个 class :

  1. 将创建 class 的许多实例
  2. 我们必须在每个保持状态或某些选项等的实例中存储 32 个标志
  3. 定义标志计数是固定的,我们不需要在运行时将其保存在可枚举变量中。 (假设我们可以定义单独的 bool 变量,而不是一个 bool 数组)
  4. 一些属性(来自每个实例)取决于我们的标志(或选项)和标志状态将在我们应用程序的热调用路径中使用(read/write)。

注意: 在该应用程序中,性能对我们很重要。

并且正如假设 #1 和 #4 所规定的那样,我们必须同时关心 speedmemory-load in balance[=16] =]


显然我们可以通过多种方式实现我们的 class。例如定义标志 Enum 字段,或使用 BitVector,或定义单独的(boolEnumint ...)变量,否则定义 uint 变量并使用位掩码,以保持每个实例的状态。但是:

由于没有人回答我的问题,我做了一些测试和研究,我会自己回答,希望对其他人有用:

Which is The Most Efficient way to keep status flags for this situation?

因为 the computer will align data in memory according to the processor architecture ,即使在 C#(作为一种高级语言)中,通常最好避免在 类.

中使用单独的布尔字段
  • 最好使用基于位掩码的解决方案(与标记 EnumBitVector32 或手动位掩码操作相同)。对于两个或多个布尔值,它是内存加载方面更好的解决方案并且速度很快。但是当我们只有一个布尔状态变量时,这是无用的。

通常我们可以说,如果我们选择标志 EnumBitVector32 作为解决方案,它 应该几乎与我们预期的手动位掩码操作一样快 在大多数情况下在 C# 中。

  • 当我们需要使用除布尔值之外的各种小数值范围作为状态时,BitVector32 作为一个现有的实用程序很有用,它可以帮助我们将状态保存在一个变量中并节省内存负载。

  • 我们可能更喜欢使用标志 Enum 让我们的代码更易于维护和清晰。

我们也可以说一下问题的第二部分

Is it ( = the most efficient way) deeply depends on current in-using tools such as Compiler or even Runtime (CLR)?

部分是。 当我们选择上述解决方案中的每一个(而不是手动按位运算)时,性能取决于将执行的编译器优化(例如,在我们使用 BitVector32Enum 时进行的方法调用和或枚举操作等)。所以优化会提升我们的代码,这似乎在 C# 中很常见,但是对于每个解决方案而不是手动按位操作,使用工具而不是 .net 官方,最好在这种情况下进行测试。