C# 在c中保存状态标志(32项以下)的最有效方法#

C# 在c中保存状态标志(32项以下)的最有效方法#,c#,performance,enums,state,bitvector,C#,Performance,Enums,State,Bitvector,假设我们正在定义一个类: 将创建该类的许多实例 我们必须在每个实例中存储32个标志,以保持状态或某些选项等 定义标志计数是固定的,我们不需要在运行时将其保存在可枚举变量中。(假设我们可以定义单独的bool变量,而不是一个bool数组) 某些属性(来自每个实例)取决于我们的标志(或选项),标志状态将在应用程序的热调用路径中使用(读/写) 注意:在该应用程序中,性能对我们很重要 正如假设#1和#4所规定的那样,我们必须平衡考虑速度和内存负载 显然,我们可以通过几种方式实现我们的类。例如,定义标志E

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

  • 将创建该类的许多实例
  • 我们必须在每个实例中存储32个标志,以保持状态或某些选项等
  • 定义标志计数是固定的,我们不需要在运行时将其保存在可枚举变量中。(假设我们可以定义单独的bool变量,而不是一个bool数组)
  • 某些属性(来自每个实例)取决于我们的标志(或选项),标志状态将在应用程序的热调用路径中使用(读/写)
  • 注意:在该应用程序中,性能对我们很重要

    正如假设#1和#4所规定的那样,我们必须平衡考虑速度和内存负载


    显然,我们可以通过几种方式实现我们的类。例如,定义标志
    Enum
    字段,或使用
    位向量
    ,或定义单独的(
    bool
    Enum
    int
    变量,或定义
    uint
    变量并使用位掩码,以保持每个实例中的状态。但是:

    • 在这种情况下,保持状态标志最有效的方法是什么

    • 它(=最有效的方法)是否深深地依赖于当前使用的工具,例如编译器,甚至运行时(CLR)


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

        哪种方法最有效地保留此服务器的状态标志 情况如何

        因为,即使在C#(作为一种高级语言)中,通常还是建议避免在类中使用单独的布尔字段

        • 最好使用基于位掩码的解决方案(与标志
          Enum
          BitVector32
          或手动位掩码操作相同)。对于两个或两个以上的布尔值,它是一个更好的内存加载解决方案,而且速度很快。但是当我们有一个布尔状态变量时,这是无用的
        通常我们可以说,如果我们选择flags
        Enum
        或else
        BitVector32
        作为解决方案,它的速度应该几乎与我们在C#中手动位屏蔽操作的速度一样快

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

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

        我们也可以谈谈问题的第二部分

        这(最有效的方法)在很大程度上取决于使用电流吗 诸如编译器甚至运行时(CLR)之类的工具

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

        因为没有人回答我的问题,我进行了一些测试和研究,我将自己回答,我希望对其他人有用:

        哪种方法最有效地保留此服务器的状态标志 情况如何

        因为,即使在C#(作为一种高级语言)中,通常还是建议避免在类中使用单独的布尔字段

        • 最好使用基于位掩码的解决方案(与标志
          Enum
          BitVector32
          或手动位掩码操作相同)。对于两个或两个以上的布尔值,它是一个更好的内存加载解决方案,而且速度很快。但是当我们有一个布尔状态变量时,这是无用的
        通常我们可以说,如果我们选择flags
        Enum
        或else
        BitVector32
        作为解决方案,它的速度应该几乎与我们在C#中手动位屏蔽操作的速度一样快

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

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

        我们也可以谈谈问题的第二部分

        这(最有效的方法)在很大程度上取决于使用电流吗 诸如编译器甚至运行时(CLR)之类的工具

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

        我认为您缺少一个选项:使用单个
        uint32
        字段并使用位掩码设置和测试单个位(=flags),就像我们在古老的C时代所做的那样。根据您使用类的方式,使用
        struct
        可能更高效(更少间接)@knittl是的。我的意思是“最有效的方式”,而不是我写的(作为示例)或者不是。我将更新我的问题,使其更具表达力。我认为唯一明智的答案是:基准测试和分析不同的解决方案,然后根据您的用例选择最佳解决方案。我认为您缺少一个选项:使用单个
        uint32
        字段并使用位-