写完《
基于动态代码生成技术的动态对象工厂》一文后我一直很奇怪为什么动态代码生成的方法相对于直接使用new有如此大的劣势?道理上说动态代码一旦生成,那么它和原生代码应该也没什么区别了,那么它的执行效率应该和相应的原生代码差别不大才对。仔细观察Creator.New版本的执行过程,我猜测问题并不是出在动态生成的代码本身,而是出在周围的代码上。在我的测试程序中,我对以下代码返复调用1000万次:
Aa=(A)Creator.New(typeof(A),"a");
而Createor.New方法中要对一个SortedList进行查找,找到满足条件的Creator子类实例,然后调用它的CreateObject方法来产生对象,此查找的过程可能会很影响效率,为此我把测试部分的代码改为如下:
object[]param=newobject[]...{"a"};
Creatorcreator=Creator.GetCreator(typeof(A),param);
DateTimedt3=DateTime.Now;
for(inti=0;i<count;i++)
...{
Aa=(A)creator.CreateObject(param);
}
DateTimedt4=DateTime.Now;
显然这样做给了动态代码生成方式很大的优待,我首先取得了合适的creator子类对象,并且已经把要传的参数数组准备好了,循环里面所做的只是单纯调用动态生成的代码。不过这没关系,我就是要看看在极优环境下动态生成的代码的执行效率如何,相比直接使用new会差多少。相应的,对直接使用new方法的测试代码如下:
优化后重复一亿次所需时间(毫秒)
调用方式
|
Creator.CreateObject
|
直接使用new
|
引用类型参数
|
1个参数
|
2312.5
|
1093.75
|
3个参数
|
2593.75
|
1109.375
|
9个参数
|
2687.5
|
1093.75
|
值类型参数
|
1个参数
|
1937.5
|
1078.125
|
3个参数
|
3000
|
1093.75
|
9个参数
|
5343.75
|
1093.75
|
下面是关于此结果的几点分析:
1 此次测试结果明显好于上一次,动态生成的代码运行时间只是直接使用new的2-4倍。可见前面所做的分析是正确的,执行动态代码本身和执行原生代码在效率上没有什么差别。
2 之所以仍有2-4倍的差别,我觉得是因为动态生成的代码在参数进栈时需要先从数组中取得参数才能进栈,这样显然比直接使用new时用ldstr或类似指令要慢一些,2-4倍的差别比较正常
3 参数为引用类型动态代码的时间只是new的2倍多,而参数为值类型时倍数则较多,这是因为参数为引用类型时在从数组中取值之后需要一个拆箱操作,显然此操作是非常慢的。
4 调用动态代码时参数个数不同时所需时间也会增加,这个和预想的一样,因为由动态生成代码的部分可以看出,参数越多for循环执行的次数也越多,生成的IL代码就越长。
5 代码执行时间并不随参数的个数成倍数关系增长,这里大概因为从数组中取值的速度比较快,而newobj指令是最慢的,因此参数个数的影响不是很大。但参数为值类型时,时间增长的较快,这更说明了拆箱操作是很慢的,对结果的影响较大
6 参数为一个值类型时比参数为一个引用类型时动态代码所用的时间更短(值类型时为1937.5),引用类型时为(2312.5),但直观想象的话应该是引用类型的快一些才对,因为它不需要拆箱,并且拆箱也是个慢操作,但这与测试结果不符,我还不太清楚这是为什么。
7因同一段代码返复测试时时间也会有一些浮动,因此可以认为各种不同参数时new方法的时间几乎没有差别,可见像ldstr、ldc.i4这样的压栈操作速度是非常快的,相对于newobj来说几乎可以忽略不计。
分享到:
相关推荐
本文将深入探讨如何通过崩溃地址来找出源代码中的出错行,以此来对“仅通过崩溃地址找出源代码的出错行”一文进行补充和改进。我们将讨论几种常见的方法和技术,包括地址映射、调试器的使用以及利用工具链辅助分析。...
为了解决这一问题,《基于JAVA的动态Web图表技术实现》一文提出了一种基于Java的动态Web图表实现技术——JFreeChart,并详细介绍了其实现方法。本文将根据提供的摘要和部分内文对该技术进行深入探讨。 #### ...
总的来说,生成器模式提供了一种有效的解决复杂对象构建问题的方法,它允许我们以一种模块化的方式创建对象,提高了代码的可读性和可维护性。通过理解和掌握生成器模式,开发者可以更好地应对各种复杂的对象构造需求...
尽管基于身份的密码学提供了诸多优势,但也面临着一系列技术挑战,包括如何确保KGC的安全性、如何处理用户身份信息的验证以及如何实现高效的密钥生成和分发等。为了解决这些问题,研究者们提出了多种方案,例如使用...
总结而言,《基于神经网络技术的公路工程补充定额编制》一文不仅为公路工程建设提供了新的视角和技术路径,还对提高工程造价管理效率和准确性提供了专业指导。随着人工智能和机器学习技术的不断进步,神经网络技术在...
【一文读懂生成对抗网络 GANs 附学习资源】 生成对抗网络(Generative Adversarial Networks,简称GANs)是深度学习领域的一种创新技术,尤其在图像生成方面展现出强大的能力。这一概念由伊恩·古德费洛等人在2014...
低代码/无代码平台是一种新型的应用开发方法论,它允许用户通过图形化界面,使用少量或无需编写传统编程代码,就能快速构建应用程序。这种技术降低了软件开发的技术门槛,使得业务人员和技术人员能够更加高效地协作...
本文主要涉及的是基于智能学习的轮式移动机器人(Wheel Mobile Robot, WMR)滑动参数估计自适应鲁棒控制的MATLAB实现。MATLAB是一种强大的数值计算和...同时,这样的代码也有助于推动智能控制技术在机器人领域的进步。
编程知识+技术开发+Springboot入门知识,一文掌握Springboot体系;编程知识+技术开发+Springboot入门知识,一文掌握Springboot体系;编程知识+技术开发+Springboot入门知识,一文掌握Springboot体系;编程知识+技术...
本文基于《面向对象软件测试技术的研究与应用》一文,深入探讨面向对象测试的关键概念、测试层次、方法以及解决方案,并通过销售系统案例具体阐述不同测试层次的策略。 ### 面向对象软件测试的重要性 面向对象软件...
《基于视觉和工业机器人的动态抓取技术研究》一文探讨了现代工业向智能化转变过程中,如何通过视觉技术和工业机器人优化动态抓取技术的问题。在快速发展的科技背景下,自动化技术在工业生产中的应用愈发广泛,而传统...
《基于动态链表智能识别检测系统的设计与应用》一文主要探讨了如何利用动态链表结构来构建一个灵活且可扩展的智能识别检测系统。在当前人工智能领域快速发展的背景下,模式识别技术,如人脸识别和图像识别,已经在...
综上所述,《汽车动态称重系统的研究与设计》一文深入探讨了动态称重系统的理论基础、关键技术以及其实现方案。通过综合考虑影响动态称重的各种因素,并采取合理的硬件设计与先进的数据处理算法,成功地提高了动态...
《基于神经网络的体育新闻自动生成研究》一文,为这一问题提供了解决方案,通过引入先进的神经网络技术,实现了体育新闻的自动化生成。该技术不仅提高了新闻产出的效率,还保障了内容的质量和时效性,具有深远的研究...
通过分析区块链技术在低碳物流供应链中的耦合性,从对象、属性、功能三个维度提出了基于区块链技术的低碳物流供应链生态体系建设构想,构建了基于区块链技术的低碳物流供应链生态模型。 低碳经济的发展是一个系统化...
《基于大数据分析技术的智能教学系统》一文为我们展现了如何将大数据分析技术应用于教学领域,为传统教学模式注入新活力,提高教学质量。 传统的教学模式由于缺乏灵活性和个性化,已逐渐无法满足现代学生多样化的...
绿色创新效率、绿色投资效率:基于SBM-DEA测算面板数据(数据+Stata代码 ) 绿色创新被寄予借助新知识、新技术实现降低环境污染的期望,同时企业也能够从中得 到相应的经济效益,实现经济和环境的协调发展。 实施...
为解决这一问题,《基于分布式多传感器融合技术的坝基地下水宏观动态监测数据分析》一文提出了一项创新的技术方案——分布式多传感器融合技术。 分布式多传感器融合技术是指通过多个传感器从不同位置和时间收集数据...
”由此可见记笔记的重要性对于程序员而言,编程技术浩如烟海,新技术又层出不穷,对知识消化吸收并不易遗忘的最佳方式就是记录学习笔记。而程序员又是一个特别的群体,喜欢使用互联网的方式记录笔记,所以,本章我们带领...