.Net中各种不同的对象创建方式的速度差异(三)

作者:小菜 更新时间:2025-02-21 点击数:
简介:从前面的文章,我们发现以下两点有趣的东西:1、使用System.Activator的非泛型方法比使用泛型方法快很多(超过200%) 2、使用泛型约束和new关键

【菜科解读】

从前面的文章,我们发现以下两点有趣的东西:

1、使用System.Activator的非泛型方法比使用泛型方法快很多(超过200%) 2、使用泛型约束和new关键字创建的速度几乎和System.Activator的泛型方法的一样 在这篇文章里,我将会这两个问题做一个进一步的探究,我使用的工具就是鼎鼎大名的.Net反编译工具:Reflector,欢迎读者跟我一起探讨造成这个现象的原因。

第一段 从System.Activator.CreateInstance(Type)开始我们先用Reflector打开.net framework 3.5中的mscorlib.dll,看看这里面,微软是怎么实现的。

首先看看System.Activator.CreateInstance(Type),它直接调用了System.Activator.CreateInstance(Type, Boolean),代码如下

1 public static object CreateInstance(Type type)

2 {

3 return CreateInstance(type, false);

4 }

那么这个CreateInstance(Type, Boolean)的实现,是这样的:

01 public static object CreateInstance(Type type, bool nonPublic)

02 {

03 if (type == null)

04 {

05 throw new ArgumentNullException("type");

06 }

07 RuntimeType underlyingSystemType = type.UnderlyingSystemType as RuntimeType;

08 if (underlyingSystemType == null)

09 {

10 throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), "type");

11 }

12 return underlyingSystemType.CreateInstanceImpl(!nonPublic);

13 }

将这段代码简化一下,就是:

1 public static object CreateInstance(Type type, bool nonPublic)

2 {

3 RuntimeType underlyingSystemType = type.UnderlyingSystemType as RuntimeType;

4 return underlyingSystemType.CreateInstanceImpl(!nonPublic);

5 }

在RuntimeType的CreateInstanceImpl(bool isPublic)中,直接调用了CreateInstanceImpl(bool isPublic, bool skipVisibilityCheck, bool fillCache),这个函数的实现非常有意思,我先把代码贴出来:

01 internal object CreateInstanceImpl(bool publicOnly, bool skipVisibilityChecks, bool fillCache)

02 {

03 RuntimeTypeHandle typeHandle = this.TypeHandle;

04 ActivatorCache cache = s_ActivatorCache;

05 if (cache != null)

06 {

07 ActivatorCacheEntry entry = cache.GetEntry(this);

08 if (entry != null)

09 {

10 if ((publicOnly && (entry.m_ctor != null)) && ((entry.m_hCtorMethodHandle.GetAttributes() & MethodAttributes.MemberAccessMask) != MethodAttributes.Public))

11 {

12 throw new MissingMethodException(Environment.GetResourceString("Arg_NoDefCTor"));

13 }

14 object obj2 = typeHandle.Allocate();

15 if (entry.m_ctor != null)

16 {

17 if (!skipVisibilityChecks && entry.m_bNeedSecurityCheck)

18 {

19 MethodBase.PerformSecurityCheck(obj2, entry.m_hCtorMethodHandle, this.TypeHandle.Value, 0x10000000);

20 }

21 try

22 {

23 entry.m_ctor(obj2);

24 }

25 catch (Exception exception)

26 {

27 throw new TargetInvocationException(exception);

28 }

29 }

30 return obj2;

31 }

32 }

33 return this.CreateInstanceSlow(publicOnly, fillCache);

34 }

看起来非常复杂,其实他的实现也也就实现了一个缓存机制:

检查缓存中是否存在这个构造器的委托,如果有,就调用自己的typeHandler的Allocate()方法分配内存,然后调用构造器的委托初始化对象 如果没有缓存,就调用CreateInstanceSlow(bool isPublic, bool fillCache)创建对象,并填充缓存 好吧继续再看看这个CreateInstanceSlow里面干了什么事情。

照例先贴代码吧:

01 private object CreateInstanceSlow(bool publicOnly, bool fillCache)

02 {

03 RuntimeMethodHandle emptyHandle = RuntimeMethodHandle.EmptyHandle;

04 bool bNeedSecurityCheck = true;

05 bool canBeCached = false;

06 bool noCheck = false;

07 this.CreateInstanceCheckThis();

08 if (!fillCache)

09 {

10 noCheck = true;

11 }

12 object obj2 = RuntimeTypeHandle.CreateInstance(this, publicOnly, noCheck, ref canBeCached, ref emptyHandle, ref bNeedSecurityCheck);

13 if (canBeCached && fillCache)

14 {

15 ActivatorCache cache = s_ActivatorCache;

16 if (cache == null)

17 {

18 cache = new ActivatorCache();

19 Thread.MemoryBarrier();

20 s_ActivatorCache = cache;

21 }

22 ActivatorCacheEntry ace = new ActivatorCacheEntry(this, emptyHandle, bNeedSecurityCheck);

23 Thread.MemoryBarrier();

24 cache.SetEntry(ace);

25 }

26 return obj2;

27 }

这个函数写的很复杂,其实实现的东西很简单,其一是调用RuntimeTypeHandler.CreateInstance方法创建对象,然后再填充缓存,以加快下次创建对象的速度。

好了,我们现在已经非常接近事实的真相了。

让我们从另外一个角度出发,看看CreateInstance()干了什么事情。

第二段 从System.Activator.CreateInstance()开始这里,我们先看看他的实现:

1 public static T CreateInstance()

2 {

3 bool bNeedSecurityCheck = true;

4 bool canBeCached = false;

5 RuntimeMethodHandle emptyHandle = RuntimeMethodHandle.EmptyHandle;

6 return (T) RuntimeTypeHandle.CreateInstance(typeof(T) as RuntimeType, true, true, ref canBeCached, ref emptyHandle, ref bNeedSecurityCheck);

7 }

我们忽然就看到了我们熟悉的身影:RuntimeTypeHandler.CreateInstance方法,终于殊途同归啊。

也就是说,System.Activator.CreateInstance()相当于调用了CreateInstanceSlow方法(但是没有缓存机制),这应该就是CreateInstance比CreateInstance(Type)慢的主要原因,我们回顾一下这两个方法的时间消耗:System.Activator.CreateInstance(Type):

缓存机制时间消耗 RuntimeTypeHandler.Allocate()内存分配的时间消耗 调用构造器委托初始化数据的时间消耗 这里不考虑缓存失败,调用CreateInstanceSlow的情况,因为这个只会发生一次。

System.Activator.CreateInstance(Type):

调用RuntimeTypeHandler.CreateInstance的时间消耗 在下一篇文章中,我会对这两个函数的性能差异做进一步的分析

.Net,中,各种,不同,的,对象,创建,方式,速度,

感染流感后咳嗽不停?科学用药选连花清咳片

最近,一批流感患者开始进入了恢复期。

发热、头痛、全身酸痛等流感前期症状都很快好转乃至消失了,而后期的咳嗽却连绵不休,一两个星期甚至一个月都未痊愈,尤其在夜间,睡梦中带着痰音的咳嗽,让人焦虑不已。

在社交平台上,一些网友也分享了自己的流感咳经历,“第二天开始就咳嗽,感觉把肺都要咳出来了。

”“睡着睡着就可以把自己咳醒,咳得厉害的时候,还把自己刚吃下去的食物咳出来了。

”一时之间,流感咳是如何一回事、流感咳怎么应对等话题也冲上了热搜。

流感咳是如何一回事?感染流感后出现咳嗽,其实是人体为了排出呼吸道分泌物或异物的一种保护性反射,呼吸道受到异物刺激必然会有这样的防御反射,从而维持人体处于良好的状态。

由此可见,流感后咳嗽是常见的症状,随着身体抵抗力逐渐恢复,咳嗽、流涕等流感后症状都会缓解消失。

但需要注意的是,流感后的咳嗽一般1~2周左右就会痊愈。

如果咳嗽持续时间过长,流感病毒导致的剧烈咳嗽往往伴随咽干嗓疼,会严重降低患者的生活与睡眠质量。

同时气道分泌过多痰液,会令患者高频咳嗽;且痰液中包裹着大量病毒,异常黏液甚至会阻塞细支气管和肺泡,导致呼吸道病情加重或病变。

总的来说,虽然咳嗽对身体是一种保护,但是频繁的咳嗽会严重影响人们的日常生活,还可能会诱发肺炎等等。

流感咳该怎么应对?一般来说,如果只是白天偶尔咳嗽,精神良好,食欲正常,不影响睡眠、活动情况下,可以通过调整饮食、生活习惯来缓解,比如多喝温热的水,暂时不吃或少吃油腻、辛辣刺激的食物以及冷饮,情况允许的话,也尽量少说话,同时避免烟酒刺激。

如果咳嗽厉害,伴有痉挛性咳嗽、呕吐、发热,影响睡眠和食欲等,可以在医生指导下服用止咳祛痰药物或者通过雾化吸入方法进行治疗。

在用药方面,安全性非常主要,建议选用纯中药,长期使用不用担心药物依赖,大人小孩都能服用。

近日在北京、四川、重庆、黑龙江、湖南等地发布的2023年春季流感中医药防治方案中,均推荐了中成药连花清咳片。

据了解,连花清咳片是中医络病理论指导外感咳嗽研发的创新中药,在宣肺泄热、化痰止咳方面疗效确切。

其组方融汇东汉张仲景的“麻杏石甘汤”宣肺泄热,以明代“清金化痰汤”加清半夏、前胡清泄肺热、化痰止咳,以山银花、连翘、牛蒡子清热解毒,以大黄通便、通腑泄肺,可减轻炎症因子释放及气道炎症浸润,保护气道黏膜,减少痰液生成,帮助痰液排出。

它是起效比较快的止咳药,临床研究显示,服用当天就可明显缓解咳嗽、咳痰症状。

此外,在上呼吸道感染、气管-支气管炎、肺炎、慢阻肺等疾病引发的咳嗽、咳痰症状治疗中,连花清咳片均具有明确疗效。

需要注意的是,对于流感咳嗽的治疗,一定要在专业医师指导下科学用药,按疗程足量使用。

同时辅以食疗、生活习惯多方面入手,去积极改善咳嗽症状。

流感还未过去,该做的防护,大家还要继续做起来。

咳嗽有痰,气喘胸闷,4种特效方,4个中成药助你缓解

1、肺肾气虚咳喘:劳累易发,一动加重肺肾两虚引起的久咳虚喘,好发于中老年人,常见胸闷喘急、不能平卧、呼多吸少,劳累后易发。

一动喘得更严重,一咳嗽容易小便失禁。

出虚汗,汗出后乏力,腰膝酸软。

常用方药:金匮肾气丸(桂枝、附子、熟地、山萸肉、山药、茯苓、丹皮、泽泻)合参蛤散(蛤蚧、人参)加减常用中成药:固本咳喘片(或固本咳喘胶囊),与金匮肾气丸合用。

金匮肾气丸图片仅供参考,中成药请在医师指导下使用组成:地黄、山药、酒山萸肉、茯苓、牡丹皮、泽泻、桂枝、炙附子、牛膝、盐车前子金匮肾气丸主要用来补肾阳。

阳气足,则能化气行水,降气平喘。

可用于肾阳虚引起的气息短促,腰膝酸冷,小便不利,或小便频数,怕冷,四肢不温。

固本咳喘胶囊图片仅供参考,中成药请在医师指导下使用组成:党参、白术、茯苓、麦冬、盐补骨脂、炙甘草、醋五味子用于脾虚痰盛、肾气不固所致的慢性支气管炎,咳嗽,痰多,喘息气促,一动则咳喘加剧。

2、痰热咳喘:痰黄稠,发热口干好发于风热感冒,或风寒感冒后期。

咳喘时有气上涌,胸部胀痛,痰稠黏色黄,或夹血痰,胸闷,发烧重,口渴爱喝水。

常用方药:桑白皮汤(桑白皮、半夏、苏子、杏仁、贝母、黄芩、黄连、山栀子)加减。

常用中成药:清气化痰丸、清肺化痰丸、清肺抑火丸酌情选一种。

清气化痰丸图片仅供参考,中成药请在医师指导下使用组成:酒黄芩、瓜蒌仁霜、制半夏、陈皮、胆南星、生姜、苦杏仁、枳实、茯苓用于肺热咳嗽,痰多黄稠,胸脘满闷。

清肺化痰丸图片仅供参考,中成药请在医师指导下使用组成:胆南星、苦杏仁、法半夏、炒枳壳、酒黄芩用于肺热咳嗽,痰多,气喘,肺气不畅。

3、风寒咳喘:痰白稀,怕冷,口不渴在天气变冷、受凉、吹风的情况下容易发作。

呼吸急促,痰白稀,带泡沫,咽喉痒,兼头痛鼻塞,怕冷,一般不口渴。

常用方药:麻黄汤(麻黄、杏仁、桂枝、甘草)合华盖散(麻黄、杏仁、桑白皮、紫苏子、茯苓、橘红、甘草)加减。

常用中成药:通宣理肺丸。

通宣理肺丸图片仅供参考,中成药请在医师指导下使用组成:紫苏叶、前胡、桔梗、苦杏仁、麻黄、甘草、陈皮、制半夏、茯苓、炒枳壳、黄芩用于风寒感冒咳嗽,咳痰不畅,发热怕冷,鼻塞流涕,头痛无汗,肢体酸痛。

4、寒饮咳喘:痰白稀且多,胸闷,不能平躺在天气变冷、受凉、吹风的情况下容易发作。

咳嗽气喘,喉中痰鸣,痰多,咳痰稀薄色白,或者有泡沫,胸闷气短而喘,不能平躺,怕冷。

常用方药:小青龙汤(麻黄、芍药、细辛、干姜、炙甘草、桂枝、五味子、半夏洗)加减。

常用中成药:小青龙颗粒。

小青龙颗粒图片仅供参考,中成药请在医师指导下使用组成:麻黄、桂枝、干姜、细辛、法半夏、五味子、白芍、炙甘草用于风寒水饮,表现为怕冷发热,头痛身痛,喘咳,胸闷喘憋,不能平躺,痰清稀而量多,舌苔白滑。

小青龙颗粒适用的典型症状是:喘憋,咳嗽清稀白痰,而且痰多。

这类人还有个特点,只能坐着、斜靠着,但是不能平卧,一躺下咳喘就加重。

这是因为水湿重,就像一个瓶子一样,倒下了水湿一下就上到喉咙,导致咳喘。

黄药师小贴士:总结1、肺肾气虚咳喘:劳累易发,一动加重固本咳喘片/胶囊+金匮肾气丸2、痰热咳喘:痰黄稠,发热口干清气化痰丸/清肺化痰丸/清肺抑火丸3、风寒咳喘:痰白稀,怕冷,口不渴通宣理肺丸4、寒饮咳喘:痰白稀且多,胸闷,不能平躺小青龙颗粒以上药物请在医师指导下辨证使用,如果情况较严重,请及时到正规医院就诊。

考考你:以下药物可用于痰白稀且量多、喘时不能平卧的中成药是?单选固本咳喘胶囊3清肺化痰丸5通宣理肺丸5小青龙颗粒922 人参与 还有 4 天 19 小时结束

加入收藏
               

.Net中各种不同的对象创建方式的速度差异(三)

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录