在 C# 中保留状态标志(低于 32 项)的最有效方法
Most effecient way to keep status flags (under 32 items) in c#
假设我们正在定义一个 class :
- 将创建 class 的许多实例
- 我们必须在每个保持状态或某些选项等的实例中存储 32 个标志
- 定义标志计数是固定的,我们不需要在运行时将其保存在可枚举变量中。 (假设我们可以定义单独的 bool 变量,而不是一个 bool 数组)
- 一些属性(来自每个实例)取决于我们的标志(或选项)和标志状态将在我们应用程序的热调用路径中使用(read/write)。
注意: 在该应用程序中,性能对我们很重要。
并且正如假设 #1 和 #4 所规定的那样,我们必须同时关心 speed 和 memory-load in balance[=16] =]
显然我们可以通过多种方式实现我们的 class。例如定义标志 Enum
字段,或使用 BitVector
,或定义单独的(bool
或 Enum
或 int
...)变量,否则定义 uint
变量并使用位掩码,以保持每个实例的状态。但是:
对于这种情况,保持状态标志的最有效方法是什么?
是否(=最有效的方式)很大程度上取决于当前正在使用的工具,例如编译器甚至 运行时 (CLR)?
由于没有人回答我的问题,我做了一些测试和研究,我会自己回答,希望对其他人有用:
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#(作为一种高级语言)中,通常最好避免在 类.
中使用单独的布尔字段
- 最好使用基于位掩码的解决方案(与标记
Enum
或 BitVector32
或手动位掩码操作相同)。对于两个或多个布尔值,它是内存加载方面更好的解决方案并且速度很快。但是当我们只有一个布尔状态变量时,这是无用的。
通常我们可以说,如果我们选择标志 Enum
或 BitVector32
作为解决方案,它 应该几乎与我们预期的手动位掩码操作一样快 在大多数情况下在 C# 中。
当我们需要使用除布尔值之外的各种小数值范围作为状态时,BitVector32
作为一个现有的实用程序很有用,它可以帮助我们将状态保存在一个变量中并节省内存负载。
我们可能更喜欢使用标志 Enum
让我们的代码更易于维护和清晰。
我们也可以说一下问题的第二部分
Is it ( = the most efficient way) deeply depends on current in-using
tools such as Compiler or even Runtime (CLR)?
部分是。
当我们选择上述解决方案中的每一个(而不是手动按位运算)时,性能取决于将执行的编译器优化(例如,在我们使用 BitVector32
或 Enum
时进行的方法调用和或枚举操作等)。所以优化会提升我们的代码,这似乎在 C# 中很常见,但是对于每个解决方案而不是手动按位操作,使用工具而不是 .net 官方,最好在这种情况下进行测试。
假设我们正在定义一个 class :
- 将创建 class 的许多实例
- 我们必须在每个保持状态或某些选项等的实例中存储 32 个标志
- 定义标志计数是固定的,我们不需要在运行时将其保存在可枚举变量中。 (假设我们可以定义单独的 bool 变量,而不是一个 bool 数组)
- 一些属性(来自每个实例)取决于我们的标志(或选项)和标志状态将在我们应用程序的热调用路径中使用(read/write)。
注意: 在该应用程序中,性能对我们很重要。
并且正如假设 #1 和 #4 所规定的那样,我们必须同时关心 speed 和 memory-load in balance[=16] =]
显然我们可以通过多种方式实现我们的 class。例如定义标志 Enum
字段,或使用 BitVector
,或定义单独的(bool
或 Enum
或 int
...)变量,否则定义 uint
变量并使用位掩码,以保持每个实例的状态。但是:
对于这种情况,保持状态标志的最有效方法是什么?
是否(=最有效的方式)很大程度上取决于当前正在使用的工具,例如编译器甚至 运行时 (CLR)?
由于没有人回答我的问题,我做了一些测试和研究,我会自己回答,希望对其他人有用:
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#(作为一种高级语言)中,通常最好避免在 类.
中使用单独的布尔字段- 最好使用基于位掩码的解决方案(与标记
Enum
或BitVector32
或手动位掩码操作相同)。对于两个或多个布尔值,它是内存加载方面更好的解决方案并且速度很快。但是当我们只有一个布尔状态变量时,这是无用的。
通常我们可以说,如果我们选择标志 Enum
或 BitVector32
作为解决方案,它 应该几乎与我们预期的手动位掩码操作一样快 在大多数情况下在 C# 中。
当我们需要使用除布尔值之外的各种小数值范围作为状态时,
BitVector32
作为一个现有的实用程序很有用,它可以帮助我们将状态保存在一个变量中并节省内存负载。我们可能更喜欢使用标志
Enum
让我们的代码更易于维护和清晰。
我们也可以说一下问题的第二部分
Is it ( = the most efficient way) deeply depends on current in-using tools such as Compiler or even Runtime (CLR)?
部分是。
当我们选择上述解决方案中的每一个(而不是手动按位运算)时,性能取决于将执行的编译器优化(例如,在我们使用 BitVector32
或 Enum
时进行的方法调用和或枚举操作等)。所以优化会提升我们的代码,这似乎在 C# 中很常见,但是对于每个解决方案而不是手动按位操作,使用工具而不是 .net 官方,最好在这种情况下进行测试。