国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

[ C# ] 判斷一個類是否實現了某個接口的多種方法及性能分析

2019-11-17 02:19:39
字體:
來源:轉載
供稿:網友

[ C# ] 判斷一個類是否實現了某個接口的多種方法及性能分析

IEntity為一個接口,Entity為實現IEntity接口的類:

interface IEntity{    int Id { get; set; }}public class Entity : IEntity{    public int Id { get; set; }    public string PRop { get; set; }}

我們要判斷Entity是否實現了IEntity接口,根據找到的帖子

c# 如何判斷一個類是否實現了某個接口

在C#中判斷某個類是否實現了某個接口

整理有如下五種方式:

1.

Entity entity = new Entity();if (entity is IEntity){}

2.

Entity entity = new Entity();IEntity temp = entity as IEntity;if (temp != null){ }

3.

if (typeof(IEntity).IsAssignableFrom(typeof(Entity))){ }

4.

if (typeof(Entity).GetInterfaces().Contains(typeof(IEntity))){ }

5.

if (typeof(Entity).GetInterface("IEntity")!=null){}

但是我們知道,前2種方式要實例化Entity的新實例,后面三種方式要用到反射,這都是相對耗性能的操作!

那么這幾種判斷Entity是否實現了IEntity接口的方式哪一種相對來說對性能的消耗低呢?

我們讓每個方法都執行1000萬次:(以下測試均為Release 模式,.net framework 4.5.1框架)

Stopwatch stopwatch = null;int count = 10000000;Console.WriteLine("執行次數 {0}", count);stopwatch = Stopwatch.StartNew();for (int i = 0; i < count; i++){    Entity entity = new Entity();    if (entity is IEntity) { }}Console.WriteLine(stopwatch.Elapsed);stopwatch = Stopwatch.StartNew();for (int i = 0; i < count; i++){    Entity entity = new Entity();    IEntity temp = entity as IEntity;    if (temp != null) { }}Console.WriteLine(stopwatch.Elapsed);stopwatch = Stopwatch.StartNew();for (int i = 0; i < count; i++){    if (typeof(IEntity).IsAssignableFrom(typeof(Entity))) { }}Console.WriteLine(stopwatch.Elapsed);stopwatch = Stopwatch.StartNew();for (int i = 0; i < count; i++){    if (typeof(Entity).GetInterfaces().Contains(typeof(IEntity))) { }}Console.WriteLine(stopwatch.Elapsed);stopwatch = Stopwatch.StartNew();for (int i = 0; i < count; i++){    if (typeof(Entity).GetInterface("IEntity")!=null) { }}Console.WriteLine(stopwatch.Elapsed);

  測試結果:

   執行1億次的測試如下:

可以看出使用了反射的后三種方式的性能消耗明顯高于前兩種方式。那么是不是結果一定是這樣呢?

我們回到上面Entity類的定義發現,Entity類只有2個屬性,而實例化Entity的主要開銷是是根據類型所有字段的長度總和計算的。那么我們把Enity的屬性增加到30個,每個方法執行1億次的結果:

這時發現使用了反射的后三種方式的性能消耗幾乎沒有變化,而有實例化操作的前兩種方式所消耗的時間發生了成倍的增長!

我們繼續增加Enity的屬性到60個,每個方法執行1億次的結果:

繼續增加Enity的屬性到90個,每個方法執行1億次的結果:

當Entity類的屬性到90的時候,實例化所需要的性能消耗已經遠遠超過兩次typeof()所帶來的性能消耗了。

最后我的結論是,在類和接口的屬性/字段數量少的時候,判斷某個類是否實現了某個接口,性能消耗依次是:方式2<方式1<方式3<方式4<方式5

        在類和接口的屬性/字段相對較多的時候,判斷某個類是否實現了某個接口,性能消耗依次是:方式3<方式2<方式1<方式4<方式5

那么為什么方式2的性能要優于方式1,就留給園友們來回答吧 demo下載


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 夏邑县| 稷山县| 文水县| 志丹县| 临西县| 板桥市| 台东市| 镇远县| 克山县| 石城县| 青川县| 云和县| 当阳市| 荥经县| 吉木乃县| 阜宁县| 霍山县| 东海县| 拜泉县| 墨玉县| 乐山市| 翁牛特旗| 大石桥市| 万全县| 海南省| 颍上县| 靖远县| 枣阳市| 资兴市| 新竹县| 太湖县| 华蓥市| 灌南县| 东阳市| 泰和县| 南丰县| 米林县| 崇州市| 罗江县| 宣武区| 涪陵区|