有谁知道Enum.HasFlag的内部原理,为什么它这么慢?
实际检查只是简单的签入Enum.HasFlag
-这不是问题。话虽如此,它比您自己的位检查要慢…
造成这种速度下降的原因有两个:
首先,Enum.HasFlag
进行显式检查,以确保枚举的类型和标志的类型都是相同的类型,并且来自相同的枚举。这张支票有一些费用。
其次,有一个不幸的箱和值的拆箱一次转化的过程中UInt64
发生的内部的HasFlag
。我认为,这是由于必须Enum.HasFlag
与所有枚举一起使用,而与基础存储类型无关。
话虽如此,它有一个巨大的优势Enum.HasFlag
-它可靠,整洁,并使代码非常明显和富有表现力。在大多数情况下,我认为这值得付出成本- 但是,如果您在性能非常关键的循环中使用它,则值得自己检查一下。