is vs typeof
哪一段代码更快?
编辑:我知道他们不会做同样的事情。
如果他们不做同样的事情,哪种速度更快更重要?比较不同意思的陈述的表现似乎是个坏主意。
不是同一件事。
这应该回答那个问题,然后回答一些。
第二行是
他们不做同样的事。如果obj的类型为classa或classa的某个子类,则第一个类是有效的。第二个将只匹配ClassA类型的对象。第二个会更快,因为它不需要检查类层次结构。
对于那些想知道原因,但又不想阅读is-vs-typeof中引用的文章的人。
我做了一些基准测试,他们做相同的密封类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | var c1 =""; var c2 = typeof(string); object oc1 = c1; object oc2 = c2; var s1 = 0; var s2 = '.'; object os1 = s1; object os2 = s2; bool b = false; Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < 10000000; i++) { b = c1.GetType() == typeof(string); // ~60ms b = c1 is string; // ~60ms b = c2.GetType() == typeof(string); // ~60ms b = c2 is string; // ~50ms b = oc1.GetType() == typeof(string); // ~60ms b = oc1 is string; // ~68ms b = oc2.GetType() == typeof(string); // ~60ms b = oc2 is string; // ~64ms b = s1.GetType() == typeof(int); // ~130ms b = s1 is int; // ~50ms b = s2.GetType() == typeof(int); // ~140ms b = s2 is int; // ~50ms b = os1.GetType() == typeof(int); // ~60ms b = os1 is int; // ~74ms b = os2.GetType() == typeof(int); // ~60ms b = os2 is int; // ~68ms b = GetType1<string, string>(c1); // ~178ms b = GetType2<string, string>(c1); // ~94ms b = Is<string, string>(c1); // ~70ms b = GetType1<string, Type>(c2); // ~178ms b = GetType2<string, Type>(c2); // ~96ms b = Is<string, Type>(c2); // ~65ms b = GetType1<string, object>(oc1); // ~190ms b = Is<string, object>(oc1); // ~69ms b = GetType1<string, object>(oc2); // ~180ms b = Is<string, object>(oc2); // ~64ms b = GetType1<int, int>(s1); // ~230ms b = GetType2<int, int>(s1); // ~75ms b = Is<int, int>(s1); // ~136ms b = GetType1<int, char>(s2); // ~238ms b = GetType2<int, char>(s2); // ~69ms b = Is<int, char>(s2); // ~142ms b = GetType1<int, object>(os1); // ~178ms b = Is<int, object>(os1); // ~69ms b = GetType1<int, object>(os2); // ~178ms b = Is<int, object>(os2); // ~69ms } sw.Stop(); MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString()); |
要测试泛型类型的泛型函数:
1 2 3 4 5 6 7 8 9 10 11 12 |
我也尝试过自定义类型,结果是一致的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | var c1 = new Class1(); var c2 = new Class2(); object oc1 = c1; object oc2 = c2; var s1 = new Struct1(); var s2 = new Struct2(); object os1 = s1; object os2 = s2; bool b = false; Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < 10000000; i++) { b = c1.GetType() == typeof(Class1); // ~60ms b = c1 is Class1; // ~60ms b = c2.GetType() == typeof(Class1); // ~60ms b = c2 is Class1; // ~55ms b = oc1.GetType() == typeof(Class1); // ~60ms b = oc1 is Class1; // ~68ms b = oc2.GetType() == typeof(Class1); // ~60ms b = oc2 is Class1; // ~68ms b = s1.GetType() == typeof(Struct1); // ~150ms b = s1 is Struct1; // ~50ms b = s2.GetType() == typeof(Struct1); // ~150ms b = s2 is Struct1; // ~50ms b = os1.GetType() == typeof(Struct1); // ~60ms b = os1 is Struct1; // ~64ms b = os2.GetType() == typeof(Struct1); // ~60ms b = os2 is Struct1; // ~64ms b = GetType1<Class1, Class1>(c1); // ~178ms b = GetType2<Class1, Class1>(c1); // ~98ms b = Is<Class1, Class1>(c1); // ~78ms b = GetType1<Class1, Class2>(c2); // ~178ms b = GetType2<Class1, Class2>(c2); // ~96ms b = Is<Class1, Class2>(c2); // ~69ms b = GetType1<Class1, object>(oc1); // ~178ms b = Is<Class1, object>(oc1); // ~69ms b = GetType1<Class1, object>(oc2); // ~178ms b = Is<Class1, object>(oc2); // ~69ms b = GetType1<Struct1, Struct1>(s1); // ~272ms b = GetType2<Struct1, Struct1>(s1); // ~140ms b = Is<Struct1, Struct1>(s1); // ~163ms b = GetType1<Struct1, Struct2>(s2); // ~272ms b = GetType2<Struct1, Struct2>(s2); // ~140ms b = Is<Struct1, Struct2>(s2); // ~163ms b = GetType1<Struct1, object>(os1); // ~178ms b = Is<Struct1, object>(os1); // ~64ms b = GetType1<Struct1, object>(os2); // ~178ms b = Is<Struct1, object>(os2); // ~64ms } sw.Stop(); MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString()); |
类型:
1 2 3 4 | sealed class Class1 { } sealed class Class2 { } struct Struct1 { } struct Struct2 { } |
推论:
在
在一个对象实例中,
在通用类型上,如果
简而言之,如果您有一个