我正在做一些速度测试,我注意到Enum.HasFlag比使用按位操作慢大约16倍.
有谁知道Enum.HasFlag的内部以及为什么它如此之慢?我的意思是两倍慢不会太糟糕但是当它慢了16倍时它会使该功能无法使用.
如果有人想知道,这是我用来测试其速度的代码.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace app
{
public class Program
{
[Flags]
public enum Test
{
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8
}
static int num = 0;
static Random rand;
static void Main(string[] args)
{
int seed = (int)DateTime.UtcNow.Ticks;
var st1 = new SpeedTest(delegate
{
Test t = Test.Flag1;
t |= (Test)rand.Next(1, 9);
if (t.HasFlag(Test.Flag4))
num++;
});
var st2 = new SpeedTest(delegate
{
Test t = …Run Code Online (Sandbox Code Playgroud) 如果我们有一个像这样的简单类:
class MyClass
{
public void DoSomething(object anObj)
{
Console.WriteLine("I am an Object: {0}", anObj);
}
public void DoSomething(string aStr)
{
Console.WriteLine("I am a String: {0}", aStr);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们这样做:
var myClass = new MyClass();
myClass.DoSomething("A message");
Run Code Online (Sandbox Code Playgroud)
输出是"我是一个字符串:一些文本"
好.那样就好.但是,如果我们使用扩展方法进行"类似"重载,例如:
class MyClass
{
public void DoSomething(object anObj)
{
Console.WriteLine("I am an Object: {0}", anObj);
}
}
static class MyClassExtension
{
public static void DoSomething(this MyClass myClass, string aStr)
{
Console.WriteLine("I am a String: {0}", aStr);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们执行与以前相同的代码:
var myClass = …Run Code Online (Sandbox Code Playgroud)