成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > .NET獲取枚舉DescriptionAttribute描述信息性能改進(jìn)的多種方法

.NET獲取枚舉DescriptionAttribute描述信息性能改進(jìn)的多種方法

熱門(mén)標(biāo)簽:天心智能電銷(xiāo)機(jī)器人 地圖定位圖標(biāo)標(biāo)注 地圖標(biāo)注的公司有哪些 塔城代理外呼系統(tǒng) 遂寧市地圖標(biāo)注app 地圖標(biāo)注專(zhuān)業(yè)團(tuán)隊(duì) 代理接電話機(jī)器人如何取消 400電話辦理哪家性?xún)r(jià)比高 濮陽(yáng)外呼電銷(xiāo)系統(tǒng)怎么樣

一. DescriptionAttribute的普通使用方式

1.1 使用示例

  DescriptionAttribute特性可以用到很多地方,比較常見(jiàn)的就是枚舉,通過(guò)獲取枚舉上定義的描述信息在UI上顯示,一個(gè)簡(jiǎn)單的枚舉定義:

public enum EnumGender
{
None,
[System.ComponentModel.Description("男")]
Male,
[System.ComponentModel.Description("女")]
Female,
Other,
} 

  本文不討論DescriptionAttribute的其他應(yīng)用場(chǎng)景,也不關(guān)注多語(yǔ)言的實(shí)現(xiàn),只單純的研究下獲取枚舉描述信息的方法。

  一般比較常見(jiàn)的獲取枚舉描述信息的方法如下,可以在園子里搜索類(lèi)似的代碼非常多。

public static string GetDescriptionOriginal(this Enum @this)
{
var name = @this.ToString();
var field = @this.GetType().GetField(name);
if (field == null) return name;
var att = System.Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute), false);
return att == null ? field.Name : ((DescriptionAttribute)att).Description;
}

  簡(jiǎn)單測(cè)試下:

Console.WriteLine(EnumGender.Female.GetDescriptionOriginal());
Console.WriteLine(EnumGender.Male.GetDescriptionOriginal());
Console.WriteLine(EnumGender.Other.GetDescriptionOriginal()); //輸出結(jié)果: 
女 
男 
Other

1.2 上面的實(shí)現(xiàn)代碼的問(wèn)題

  首先要理解特性是什么?

特性:

Attribute特性就是關(guān)聯(lián)了一個(gè)目標(biāo)對(duì)象的一段配置信息,存儲(chǔ)在dll內(nèi)的元數(shù)據(jù)。它本身沒(méi)什么意義,可以通過(guò)反射來(lái)獲取配置的特性信息。

  因此主要問(wèn)題其實(shí)就是反射造成的嚴(yán)重性能問(wèn)題:

•1.每次調(diào)用都會(huì)使用反射,效率慢!
•2.每次調(diào)用反射都會(huì)生成新的DescriptionAttribute對(duì)象,哪怕是同一個(gè)枚舉值。造成內(nèi)存、GC的極大浪費(fèi)!
•3.好像不支持位域組合對(duì)象!
•4.這個(gè)地方的方法參數(shù)是Enum,Enum是枚舉的基類(lèi),他是一個(gè)引用類(lèi)型,而枚舉是值類(lèi)型,該方法會(huì)造成裝箱,不過(guò)這個(gè)問(wèn)題好像是不可避免的。

  性能到底有多差呢?代碼來(lái)實(shí)測(cè)一下:

[Test]
public void GetDescriptionOriginal_Test()
{
var enums = this.GetTestEnums();
Console.WriteLine(enums.Count);
TestHelper.InvokeAndWriteAll(() =>
{
System.Threading.Tasks.Parallel.For(0, 1000000, (i, obj) =>
{
foreach (var item in enums)
{
var a = item.GetDescriptionOriginal();
}
});
});
}
//輸出結(jié)果:
80
TimeSpan:79,881.0000ms //共消耗了將近80秒
MemoryUsed:-1,652.7970KB
CollectionCount(0):7,990.00 //0代GC回收了7千多次,因?yàn)閯?chuàng)建了大量的DescriptionAttribute對(duì)象 

  其中this.GetTestEnums();方法使用獲取一個(gè)枚舉值集合,用于測(cè)試的,集合大小80,執(zhí)行100w次,相當(dāng)于執(zhí)行了8000w次GetDescriptionOriginal方法。

  TestHelper.InvokeAndWriteAll方法是用來(lái)計(jì)算執(zhí)行前后的時(shí)間、內(nèi)存消耗、0代GC回收次數(shù)的,文末附錄中給出了代碼,由于內(nèi)存回收的原因,內(nèi)存消耗計(jì)算其實(shí)不準(zhǔn)確的,不過(guò)可以參考第三個(gè)指標(biāo)0代GC回收次數(shù)。

二. 改進(jìn)的DescriptionAttribute方法

  知道了問(wèn)題原因,解決就好辦了,基本思路就是把獲取到的文本值緩存起來(lái),一個(gè)枚舉值只反射一次,這樣性能問(wèn)題就解決了。

2.1 使用字典緩存+鎖

  因?yàn)槭褂渺o態(tài)變量字典來(lái)緩存值,就涉及到線程安全,需要使用鎖(做了雙重檢測(cè)),具體方法:

private static DictionaryEnum, string> _LockDictionary = new DictionaryEnum, string>();
public static string GetDescriptionByDictionaryWithLocak(this Enum @this)
{
if (_LockDictionary.ContainsKey(@this)) return _LockDictionary[@this];
Monitor.Enter(_obj);
if (!_LockDictionary.ContainsKey(@this))
{
var value = @this.GetDescriptionOriginal();
_LockDictionary.Add(@this, value);
}
Monitor.Exit(_obj);
return _LockDictionary[@this];
} 

  來(lái)測(cè)試一下,測(cè)試數(shù)據(jù)、次數(shù)和1.2的GetDescriptionOriginal_Test相同,效率有很大的提升,只有一次內(nèi)存回收。

[Test]
public void GetDescriptionByDictionaryWithLocak_Test()
{
var enums = this.GetTestEnums();
Console.WriteLine(enums.Count)
TestHelper.InvokeAndWriteAll(() =>
{
System.Threading.Tasks.Parallel.For(0, 1000000, (i, obj) =>
{
foreach (var item in enums)
{
var a = item.GetDescriptionByDictionaryWithLocak();
}
});
});
}
//測(cè)試結(jié)果:
80
TimeSpan:1,860.0000ms
MemoryUsed:159.2422KB
CollectionCount(0):1.00 

2.2 使用字典緩存+異常(不走尋常路的方式)

  還是先看看實(shí)現(xiàn)方法吧!

private static DictionaryEnum, string> _ExceptionDictionary = new DictionaryEnum, string>();
public static string GetDescriptionByDictionaryWithException(this Enum @this)
{
try
{
return _ExceptionDictionary[@this];
}
catch (KeyNotFoundException)
{
Monitor.Enter(_obj);
if (!_ExceptionDictionary.ContainsKey(@this))
{
var value = @this.GetDescriptionOriginal();
_ExceptionDictionary.Add(@this, value);
}
Monitor.Exit(_obj);
return _ExceptionDictionary[@this];
}
}

  假設(shè)我們的使用場(chǎng)景是這樣的:項(xiàng)目定義的枚舉并不多,但是用其描述值很頻繁,比如定義了一個(gè)用戶性別枚舉,用的地方很多,使用頻率很高。

  上面GetDescriptionByDictionaryWithLocak的方法中,第一句代碼“if (_LockDictionary.ContainsKey(@this)) ”就是驗(yàn)證是否包含枚舉值。在2.1的測(cè)試中執(zhí)行了8000w次,其中只有80次(總共只有80個(gè)枚舉值用于測(cè)試)需要這句代碼“if (_LockDictionary.ContainsKey(@this)) ”,其余的直接取值就可了?;谶@樣的考慮,就有了上面的方法GetDescriptionByDictionaryWithException。

  來(lái)測(cè)試一下,看看效果吧!

[Test]
public void GetDescriptionByDictionaryWithException_Test()
{
var enums = this.GetTestEnums();
Console.WriteLine(enums.Count);
TestHelper.InvokeAndWriteAll(() =>
{
System.Threading.Tasks.Parallel.For(0, 1000000, (i, obj) =>
{
foreach (var item in enums)
{
var a = item.GetDescriptionByDictionaryWithException();
}
});
});
}
//測(cè)試結(jié)果:
80
TimeSpan:1,208.0000ms
MemoryUsed:230.9453KB
CollectionCount(0):1.00

  測(cè)試結(jié)果來(lái)看,基本上差不多,在時(shí)間上略微快樂(lè)一點(diǎn)點(diǎn),1,208.0000ms:1,860.0000ms,執(zhí)行8000w次快600毫秒,好像差別也不大啊,這是為什么呢?

  這個(gè)其實(shí)就是Dictionary的問(wèn)題了,Dictionary內(nèi)部使用散列算法計(jì)算存儲(chǔ)地址,其查找的時(shí)間復(fù)雜度為o(1),他的查找效果是非??斓?,而本方法中利用了異常處理,異常捕獲本身是有一定性能影響的。

2.3 推薦簡(jiǎn)單方案:ConcurrentDictionary

  ConcurrentDictionary是一個(gè)線程安全的字典類(lèi),代碼:

private static ConcurrentDictionaryEnum, string> _ConcurrentDictionary = new ConcurrentDictionaryEnum, string>();
public static string GetDescriptionByConcurrentDictionary(this Enum @this)
{
return _ConcurrentDictionary.GetOrAdd(@this, (key) =>
{
var type = key.GetType();
var field = type.GetField(key.ToString());
return field == null ? key.ToString() : GetDescription(field);
});
}

  測(cè)試代碼及測(cè)試結(jié)果:

[Test]
public void GetDescriptionByConcurrentDictionary_Test()
{
var enums = this.GetTestEnums();
Console.WriteLine(enums.Count);
TestHelper.InvokeAndWriteAll(() =>
{
System.Threading.Tasks.Parallel.For(0, 1000000, (i, obj) =>
{
foreach (var item in enums)
{
var a = item.GetDescriptionByConcurrentDictionary();
}
});
});
}
//測(cè)試結(jié)果:
80
TimeSpan:1,303.0000ms
MemoryUsed:198.0859KB
CollectionCount(0):1.00 

2.4 正式的代碼

  綜上所述,解決了性能問(wèn)題、位域枚舉問(wèn)題的正式的代碼:

/// summary>
/// 獲取枚舉的描述信息(Descripion)。
/// 支持位域,如果是位域組合值,多個(gè)按分隔符組合。
/// /summary>
public static string GetDescription(this Enum @this)
{
return _ConcurrentDictionary.GetOrAdd(@this, (key) =>
{
var type = key.GetType();
var field = type.GetField(key.ToString());
//如果field為null則應(yīng)該是組合位域值,
return field == null ? key.GetDescriptions() : GetDescription(field);
});
}
/// summary>
/// 獲取位域枚舉的描述,多個(gè)按分隔符組合
/// /summary>
public static string GetDescriptions(this Enum @this, string separator = ",")
{
var names = @this.ToString().Split(',');
string[] res = new string[names.Length];
var type = @this.GetType();
for (int i = 0; i  names.Length; i++)
{
var field = type.GetField(names[i].Trim());
if (field == null) continue;
res[i] = GetDescription(field);
}
return string.Join(separator, res);
}
private static string GetDescription(FieldInfo field)
{
var att = System.Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute), false);
return att == null ? field.Name : ((DescriptionAttribute)att).Description;
}

ps:.NET獲取枚舉值的描述

一、給枚舉值定義描述的方式

public enum TimeOfDay 
{ 
[Description("早晨")] 
Moning = 1, 
[Description("下午")] 
Afternoon = 2, 
[Description("晚上")] 
Evening = 3, 
} 

二、獲取枚舉值的描述的方法

public static string GetDescriptionFromEnumValue(Type enumType, object enumValue)
{
try
{
object o = Enum.Parse(enumType, enumValue.ToString());
string name = o.ToString();
DescriptionAttribute[] customAttributes = (DescriptionAttribute[])enumType.GetField(name).GetCustomAttributes(typeof(DescriptionAttribute), false);
if ((customAttributes != null)  (customAttributes.Length == 1))
{
return customAttributes[0].Description;
}
return name;
}
catch
{
return "未知";
}
}

三、獲取枚舉值的描述的方法的使用

string strMoning = GetDescriptionFromEnumValue( typeof (TimeOfDay) , 2 );
您可能感興趣的文章:
  • .NET必知的EventCounters性能指標(biāo)監(jiān)視器詳解
  • .NET Core/Framework如何創(chuàng)建委托大幅度提高反射調(diào)用的性能詳解
  • .NET Orm性能測(cè)試分析
  • 分享提高ASP.NET Web應(yīng)用性能的技巧
  • 推薦8項(xiàng)提高 ASP.NET Web API 性能的技術(shù)
  • Asp.Net性能優(yōu)化技巧匯總
  • ASP.NET性能優(yōu)化八條建議
  • .Net性能調(diào)優(yōu)-ArrayPool詳情

標(biāo)簽:汕頭 婁底 宜春 河南 吉林 本溪 重慶 麗江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《.NET獲取枚舉DescriptionAttribute描述信息性能改進(jìn)的多種方法》,本文關(guān)鍵詞  .NET,獲取,枚舉,DescriptionAttribute,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《.NET獲取枚舉DescriptionAttribute描述信息性能改進(jìn)的多種方法》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于.NET獲取枚舉DescriptionAttribute描述信息性能改進(jìn)的多種方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    日韩一卡二卡三卡国产欧美| 久久99国产精品免费网站| 19j韩国主播韩宝贝在线| 姑娘第5集在线观看免费好剧| 丝袜制服一区二区三区| 日韩精品国产精品| 国产精品视频黄色| 91精产国品一二三| 四虎成人精品永久免费av| 亚洲综合欧美| 亚洲伦理网站| 99亚偷拍自图区亚洲| av网站在线免费看| 成人啪啪18免费游戏链接| 日本19禁啪啪吃奶大尺度| 欧美日韩另类视频| 成人免费黄色av| 成人在线免费观看| 国产一区二区三区不卡av| 国产精品jvid在线观看| 日韩在线中文字| 精品剧情在线观看| 国产精品久久久久久久午夜片| 在线免费看av片| 多人啪嗒啪嗒在线观看免费| 日韩va亚洲va欧美va清高| 日产精品久久久一区二区| 亚洲国产日韩欧美在线99| 久久国产精品-国产精品| 91国内视频| 国产成人丝袜美腿| 在线午夜精品自拍| 亚洲 欧美 中文字幕| 日韩欧美一卡二卡| 在线播放日韩欧美| 久久国产高清| 亚洲一区二区三区四区| 色综合久久综合网欧美综合网| 国产精品亚洲一区二区无码| 日本欧美久久久久免费播放网| 91视频-88av| 91爱视频在线| 国产主播在线观看| 污污的视频免费观看| 亚洲国产成人在线| 国产天堂av在线| 一本久久知道综合久久| 日韩视频国产视频| 精品国产福利视频| 97免费公开视频| 在线视频毛片| 国产黄色免费观看| 成年人视频软件| 亚洲国产欧美国产综合一区| 桃色av一区二区| 国产精品第8页| 一区二区日韩在线观看| 九七电影院97理论片久久tvb| 精品国产乱码久久久久软件| 久久97超碰国产精品超碰| 亚洲色图.com| 91亚洲欧美激情| 欧美91在线| 在线观看国产精品91| 欧美色图一区二区三区| 亚洲综合福利| 伊人成人在线观看| 国产成人亚洲综合91| 中文字幕精品三区| 激情av综合网| 麻豆久久精品| xxxx性bbbb欧美野外| h片在线观看视频免费免费| 在线观看www91| 中文字幕av一区二区三区人妻少妇| 番号在线播放| 欧美大喷水吹潮合集在线观看| 伦一区二区三区中文字幕v亚洲| 清纯唯美亚洲经典中文字幕| 精品国产一区二区三区久久久久久| 同产精品九九九| 四虎久久免费| 91在线视频免费看| 男人天堂手机在线| 性一交一乱一伧老太| 国产精品久久久久久亚洲色| 另类少妇人与禽zozz0性伦| brazzers欧美精品| 久久视频这里只有精品| 无码精品一区二区三区在线播放| 99久久久无码国产精品免费| 亚洲国产精品久久久久婷婷884| 1069男同网址| 亚洲免费在线观看| 亚洲高清视频在线播放| 2020欧美日韩在线视频| 国产高清精品软件丝瓜软件| 欧美中文在线免费| 亚洲国产综合人成综合网站| 三妻四妾完整版在线观看电视剧| 六月丁香色婷婷| 91社区国产高清| 91免费观看视频在线| 国外av在线| 91在线观看入口| 天天干天天色天天干| 国产精品美女主播| 日本欧美一二三区| 成人免费视频在线观看| 国产精品自在线拍| 91精品国产91久久综合| 黄漫在线播放| 在线免费观看视频黄| 亚洲欧美另类在线观看| 亚欧精品视频一区二区三区| 亚洲狼人综合| 日韩三级高清在线| 久久精品国产99精品国产亚洲性色| 视频一区中文| 国产精品视频精品| 97人洗澡人人免费公开视频碰碰碰| 日韩 国产 欧美| 私拍精品福利视频在线一区| 久久久久久亚洲中文字幕无码| 综合久久av| 久久一区激情| 国产精品一区无码| 国产精品福利视频一区二区三区| 先锋影音欧美四级| 欧美熟妇乱码在线一区| 亚洲午夜天堂| 欧美风狂大伦交xxxx| 日韩特级毛片| 中文字幕国产视频| 亚洲免费福利| av伊人久久| 亚洲精品在线免费看| 欧美日韩国产一级| 日本不卡一区二区三区视频| 亚洲成人激情自拍| 欧美一级视频免费观看| 天堂中文在线观看| 大桥未久一区二区| 久久av秘一区二区三区| 国产在线播放一区二区三区| 天堂在线看视频| 久久久久久九九| 亚洲色图网站| 色欲一区二区三区精品a片| 欧美精品三级在线观看| xvideos成人免费中文版| 九九热精品免费视频| 日韩美一区二区| 亚洲国产电影在线观看| 欧美成人精品一级| 欧美精品三区| 天天操天天舔天天射| 日本泡妞xxxx免费视频软件| 日韩av最新在线| 久久天天躁狠狠躁老女人| 91动漫免费网站| 四虎成人在线播放| 欧美中文在线观看国产| 777欧美精品| 亚洲午夜未满十八勿入免费观看全集| 色综合久久精品亚洲国产| 国产精品视频福利一区二区| 可以看污的网站| 国产久一道中文一区| 欧美亚洲一区二区在线| av免费网站在线| 午夜精品久久久久久久第一页按摩| 性猛交娇小69hd| 亚洲人和日本人hd| 亚洲国产一区二区视频| 日韩视频免费大全中文字幕| 中国大陆高清aⅴ毛片| 久久最新免费视频| 国产一级片子| 韩国一区二区三区美女美女秀| wwwxxx黄色片| 一色桃子久久精品亚洲| 精品久久久久亚洲| 一区二区成人网| 久久免费精彩视频| 国产成人av一区二区三区在线观看| 色婷婷综合缴情免费观看| 久久久久久国产精品久久| 国产欧美日韩视频一区二区| 玖玖精品在线| 亚洲一区二区三区毛片| 亚洲第一区第二区第三区| 日韩中文视频| 在线观看17c| 麻豆蜜桃在线观看| 国产精品第五页| 99在线视频首页| 日韩免费性生活视频播放| 激情欧美一区二区| 国产男女激情视频| 国产麻豆精品在线观看| 伊人色综合久久天天五月婷| 欧美又黄又嫩大片a级| 97se综合| 日韩欧美激情在线| 三级黄色的网站| 国产xxxx做受性欧美88| free性丰满69性欧美| 天堂av免费在线| 欧美精品在线播放| 在线尤物九色自拍| 黄色网址在线播放| 国产一区二区三区四区五区在线| 日本一级片在线播放| 91在线高清观看| 天天躁日日躁狠狠躁欧美巨大小说| 偷拍25位美女撒尿视频在线观看| 一区二区三区不卡在线观看| 日日操天天摸| 中文字幕午夜精品一区二区三区| av资源网一区| 日韩亚洲精品在线观看| 麻豆久久一区二区| 国产香蕉精品视频一区二区三区| 日本v片在线高清不卡在线观看| 伊人春色在线| 日韩精品一区二区三区第95| 最近的中文字幕在线看视频| 91九色国产ts另类人妖| 日韩人妻一区二区三区| 亚洲蜜桃精久久久久久久| 国产精品扒开腿做爽爽爽的视频| 高清不卡一区二区在线| 成人国产精品一区二区网站| 污视频网站免费| 色的视频在线免费看| 欧美交换配乱吟粗大25p| 99在线|亚洲一区二区| 青青草国产一区二区三区| 国语精品一区| 国产精品久久久久9999吃药| 男人操女人视频网站| 少妇精品在线| 日韩精品极品视频在线观看免费| 精品欧美一区二区久久久久| 久久国产热视频| 日韩欧美激情一区| 国产精品一卡二卡在线观看| 免费日韩一区二区三区| 国内外成人免费激情视频| 日韩高清一区二区| 国产精品一二三区在线| 一区二区三区在线观看动漫| 亚洲免费综合| 欧美丰满熟妇bbbbbb| 国内a∨免费播放| 蜜桃色永久入口| 91福利社在线观看| 欧美日韩国产精品一区| 在线电影院国产精品| h视频在线免费观看| 石原莉奈一区二区三区高清在线| 久久久久久九九九九| 蜜臀91精品国产高清在线观看| 色777狠狠狠综合伊人| 国产人妖在线播放| 中文字幕一区二区三区在线乱码| 日韩精品一级| 黄色一级大片在线免费观看| 欧美理论在线观看| 成人短片线上看| 精品国产乱码久久久久久鸭王1| 夜级特黄日本大片_在线| 日韩国产欧美在线播放| 精品久久久久久中文字幕2017| 秋霞久久久久久一区二区| 亚洲熟妇无码av在线播放| 亚洲黄色三级| 美女xx视频| xxxxxx国产精品视频| 欧美精品大片| 68国产成人综合久久精品| 国产精品久久久久久久久久久久午夜片| 中文字幕乱码中文字幕| 高清日韩电视剧大全免费| 久久蜜桃资源一区二区老牛| 久久久久久久久久久久国产| 一本大道久久精品| aa片在线观看视频在线播放| 蜜桃一级网站.| 国产美女免费无遮挡| 在线观看久久久久久| a一区二区三区亚洲| 成人污网站在线观看| 在线视频观看亚洲| 久久丝袜美腿综合| 日韩电影在线免费观看| 蜜臀av性久久久久av蜜臀妖精| 欧美久久久网站| 亚洲毛片在线观看| 久久久久久久久久久久久久久| 欧美专区第二页| 国产女优裸体网站| 欧美在线免费视屏| 九热这里只有精品| 色99之美女主播在线视频| 色狠狠av一区二区三区香蕉蜜桃| 亚洲午夜精品久久久久久高潮| 粉嫩一区二区三区四区公司1| 成人羞羞视频在线看网址| 欧美一区二区三区日韩视频| 欧美日韩最好看的视频| 日韩高清一区| 精精国产xxxx视频在线| 看看黄色一级片| 色乱码一区二区三区在线| 欧美日韩123| 亚洲精品免费播放| 五月天一区二区三区| 天天骑夜夜操| 日韩一区二区不卡| 国产探花在线观看| 国产有码在线一区二区视频| 亚洲精品视频区| 精品美女视频在线观看免费软件| 国产有码一区二区| 91久久国产综合久久| 在线免费观看av网站|