C# 在c中保存状态标志(32项以下)的最有效方法#
假设我们正在定义一个类:C# 在c中保存状态标志(32项以下)的最有效方法#,c#,performance,enums,state,bitvector,C#,Performance,Enums,State,Bitvector,假设我们正在定义一个类: 将创建该类的许多实例 我们必须在每个实例中存储32个标志,以保持状态或某些选项等 定义标志计数是固定的,我们不需要在运行时将其保存在可枚举变量中。(假设我们可以定义单独的bool变量,而不是一个bool数组) 某些属性(来自每个实例)取决于我们的标志(或选项),标志状态将在应用程序的热调用路径中使用(读/写) 注意:在该应用程序中,性能对我们很重要 正如假设#1和#4所规定的那样,我们必须平衡考虑速度和内存负载 显然,我们可以通过几种方式实现我们的类。例如,定义标志E
显然,我们可以通过几种方式实现我们的类。例如,定义标志
Enum
字段,或使用位向量
,或定义单独的(bool
或Enum
或int
变量,或定义uint
变量并使用位掩码,以保持每个实例中的状态。但是:
- 在这种情况下,保持状态标志最有效的方法是什么
- 它(=最有效的方法)是否深深地依赖于当前使用的工具,例如编译器,甚至运行时(CLR)
- 最好使用基于位掩码的解决方案(与标志
或Enum
或手动位掩码操作相同)。对于两个或两个以上的布尔值,它是一个更好的内存加载解决方案,而且速度很快。但是当我们有一个布尔状态变量时,这是无用的BitVector32
- 由于没有人回答我的问题,我进行了一些测试和研究,我将自己回答,我希望对其他人有用:
哪种方法最有效地保留此服务器的状态标志
情况如何
因为,即使在C#(作为一种高级语言)中,通常还是建议避免在类中使用单独的布尔字段
Enum
或elseBitVector32
作为解决方案,它的速度应该几乎与我们在C#中手动位屏蔽操作的速度一样快
- 当我们需要使用除布尔值之外的各种小数值范围作为状态时,
作为现有的util非常有用,它可以帮助我们将状态保持在一个变量中并节省内存负载BitVector32
- 我们可能更喜欢使用标志
,以使代码更易于维护和清晰Enum
当我们选择上述每个解决方案(而不是手动按位操作)时,性能取决于编译器优化(例如,在使用
BitVector32
或Enum
和/或Enum操作时进行的方法调用等)。因此,优化将增强我们的代码,这在C#中似乎很常见,但对于每个解决方案,而不是手动按位操作,使用工具而不是.net官方,最好在这种情况下进行测试。因为没有人回答我的问题,我进行了一些测试和研究,我将自己回答,我希望对其他人有用:
哪种方法最有效地保留此服务器的状态标志
情况如何
因为,即使在C#(作为一种高级语言)中,通常还是建议避免在类中使用单独的布尔字段
- 最好使用基于位掩码的解决方案(与标志
或Enum
或手动位掩码操作相同)。对于两个或两个以上的布尔值,它是一个更好的内存加载解决方案,而且速度很快。但是当我们有一个布尔状态变量时,这是无用的BitVector32
Enum
或elseBitVector32
作为解决方案,它的速度应该几乎与我们在C#中手动位屏蔽操作的速度一样快
- 当我们需要使用除布尔值之外的各种小数值范围作为状态时,
作为现有的util非常有用,它可以帮助我们将状态保持在一个变量中并节省内存负载BitVector32
- 我们可能更喜欢使用标志
,以使代码更易于维护和清晰Enum
当我们选择上述每个解决方案(而不是手动按位操作)时,性能取决于编译器优化(例如,在使用
BitVector32
或Enum
和/或Enum操作时进行的方法调用等)。因此,优化将增强我们的代码,这在C#中似乎很常见,但对于每个解决方案,而不是手动按位操作,使用工具而不是.net官方,最好在这种情况下进行测试。我认为您缺少一个选项:使用单个uint32
字段并使用位掩码设置和测试单个位(=flags),就像我们在古老的C时代所做的那样。根据您使用类的方式,使用struct
可能更高效(更少间接)@knittl是的。我的意思是“最有效的方式”,而不是我写的(作为示例)或者不是。我将更新我的问题,使其更具表达力。我认为唯一明智的答案是:基准测试和分析不同的解决方案,然后根据您的用例选择最佳解决方案。我认为您缺少一个选项:使用单个uint32
字段并使用位-