当前位置:首页 » 便宜好货 » 为什么反射性能不好

为什么反射性能不好

发布时间: 2022-05-07 10:20:21

㈠ 高并发系统,能不能考虑大量使用反射,性能影响有多大

这个问题不太具体,但是反射对系统的影响其实并不是很大,像大多数框架都大量运用反射,对于性能来说肯定是不如servlet jdbc来得快,但是并不是非常影响性能,就连hibernate这种很影响性能的框架来说如果技术运用十分纯属的话也不会造成多大影响

㈡ 反射机制的反射性能

反射是一种强大的工具,但也存在一些不足。一个主要的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。
下面的程序是字段接入性能测试的一个例子,包括基本的测试方法。每种方法测试字段接入的一种形式 -- accessSame 与同一对象的成员字段协作,accessOther 使用可直接接入的另一对象的字段,accessReflection 使用可通过反射接入的另一对象的字段。在每种情况下,方法执行相同的计算 -- 循环中简单的加/乘顺序。 程序如下:
public int accessSame(int loops) {
m_value = 0;
for (int index = 0; index < loops; index++) {
m_value = (m_value + ADDITIVE_VALUE) * MULTIPLIER_VALUE;
}
return m_value;
}
public int accessReference(int loops) {
TimingClass timing = new TimingClass();
for (int index = 0; index < loops; index++) {
timing.m_value = (timing.m_value + ADDITIVE_VALUE) * MULTIPLIER_VALUE;
}
return timing.m_value;
}
public int accessReflection(int loops) throws Exception {
TimingClass timing = new TimingClass();
try {
Field field = TimingClass.class.getDeclaredField(m_value);
for (int index = 0; index < loops; index++) {
int value = (field.getInt(timing) + ADDITIVE_VALUE) * MULTIPLIER_VALUE;
field.setInt(timing, value);
}
return timing.m_value;
} catch (Exception ex) {
System.out.println(Error using reflection);
throw ex;
} }
在上面的例子中,测试程序重复调用每种方法,使用一个大循环数,从而平均多次调用的时间衡量结果。平均值中不包括每种方法第一次调用的时间,因此初始化时间不是结果中的一个因素。下面的图清楚的向我们展示了每种方法字段接入的时间:
图 1:字段接入时间 :
我们可以看出:在前两副图中(Sun JVM),使用反射的执行时间超过使用直接接入的1000倍以上。通过比较,IBM JVM可能稍好一些,但反射方法仍旧需要比其它方法长700倍以上的时间。任何JVM上其它两种方法之间时间方面无任何显着差异,但IBM JVM几乎比Sun JVM快一倍。最有可能的是这种差异反映了Sun Hot Spot JVM的专业优化,它在简单基准方面表现得很糟糕。反射性能是Sun开发1.4 JVM时关注的一个方面,它在反射方法调用结果中显示。在这类操作的性能方面,Sun 1.4.1 JVM显示了比1.3.1版本很大的改进。 如果为为创建使用反射的对象编写了类似的计时测试程序,我们会发现这种情况下的差异不象字段和方法调用情况下那么显着。使用newInstance()调用创建一个简单的java.lang.Object实例耗用的时间大约是在Sun 1.3.1 JVM上使用new Object()的12倍,是在IBM 1.4.0 JVM的四倍,只是Sun 1.4.1 JVM上的两部。使用Array.newInstance(type, size)创建一个数组耗用的时间是任何测试的JVM上使用new type[size]的两倍,随着数组大小的增加,差异逐步缩小。

㈢ asp.net 使用反射绑定 将性能变得很慢,为什么还有要用反射呢,反射的优越性体现在哪里!

有了性能,就等舍得它的拓展性,有了拓展性,就得舍去其性能。鱼和熊掌不可兼得。反射的好处就是,它可以随时的调用任何一个方法,属性等等,而且它还可以用字符串去映射你需要的方法和属性,这样就是系统变得灵活了。使系统的拓展性变得灵活。

㈣ Java反射的性能为什么比直接调用慢一个数量级左右

反射肯定比直接调用慢

这个毋庸置疑了,我这篇文章也不是证明反射有多高效的。

现在的快递哥很火,那我们就举个快递的例子。如果快递员就在你住的小区,那么你报一个地址:xx栋xx号,那么快递员就可以马上知道你在哪里,直接就去到你家门口;但是,如果快递员是第一次来你们这里,他是不是首先得查查网络地图,看看怎么开车过去,然后到了小区是不是得先问问物管xx栋怎么找,然后,有可能转在楼下转了两个圈才到了你的门前。

我们看上面这个场景,如果快递员不熟悉你的小区,是不是会慢点,他的时间主要花费在了查找网络地图,询问物业管理。OK,反射也是一样,因为我事先什么都不知道,所以我得花时间查询一些其他资料,然后我才能找到你。大家有兴趣可以查看反射的实现原理,以及MetaData的相关概念。

反射到底比直接调用慢多少?

好了,我们知道反射肯定慢的,那么是不是反射就不能用了呢?有些人一听到慢,就非常着急的下结论,反射怎样怎样不行,怎样怎样不能用。但是,同学,反射到底比直接调用慢多少,你造吗,能给我个实际的数据吗?很多人其实对性能只有个模糊的概念,而没有数值支撑。之前我给同事找了一个动态解析表达式的类库,他觉得不太好用,他很聪明,很快的找到了用DataTale.Compute可以实现公式的动态解析。我问他,这个方法和我给的类库性能上有什么区别?他跟我说,这个已经很快了,执行1秒都不到。我一听,就觉得不对劲,你的思想还停留在秒级,跟我谈什么性能?

怎么去判断一个函数的性能?因为函数的执行太快太快了,你需要一个放慢镜,这样才能捕捉到他的速度。怎么做?把一个函数执行一百万遍或者一千万遍,你才能真正了解一个函数的性能。也就是,你如果想判断性能,你就不能还停留在秒级,毫秒级的概念,你必须用另外一个概念替代,才能知道真正的性能。结果我同事把这两种方法执行了100w遍,确实,我提供的类库比他的快了8秒。

好了,现在拿我早两天提供的工厂方法来做测试,其中CodeTimer的实现参考赵大神的文章《一个简单的性能计数器:CodeTimer》:

测试方法如下:

代码如下
复制代码

[Test]
public void TestReflector()
{
CodeTimer.Time("Direct", 100 * 10000,
() =>
{
var instance = new ConnectionTest();
});

CodeTimer.Time("Reflect", 100 * 10000,
() =>
{
this.GetType().Assembly.CreateInstance("TestPropertyGrid.ConnectionTest");
});
}

测试结果如下:

Direct
Time Elapsed: 25ms
CPU Cycles: 57,582,163
Gen 0: 14
Gen 1: 0

Reflect
Time Elapsed: 3,231ms
CPU Cycles: 8,001,720,795
Gen 0: 269
Gen 1: 1

看到没,我们的放大镜起作用了,现在我们大概可以下这么一个结论:在执行100万遍的时候,反射大概把直接调用慢50~100倍。100倍,咋一看,是相差很大的,但是,我前文说了,别着急下结论,你要看看前提条件。自古我们就喜欢断章取义,比如“以德报怨”这个成语,好像古人说让我们遇到不好的,你不能怨恨,要更好的对待他人,别人打你左脸一巴掌,你应该把右脸伸过去让他再打一下。但实际这个成语是怎样的呢?

或曰:“以德报怨,何如?”
子曰:“何以报德?以直报怨,以德报德”

老孔的意思其实是如果别人对你好,那么你就对他好,要是他招你惹你了,你就干他娘的!你看,傻眼了吧?
有多少情况下需要考虑反射带来的影响?

我认为这个情况是非常非常少的,绝大多数的我们根本就无需考虑这个。就上我上一篇文章提到的工厂,你程序有多少个实体,有100万个吗?如果你只是在弹出窗口的时候new一下,这个百万分之十秒的影响对你很重要吗?

另外,有些人讲,我要是真有这种需求,要把一个对象new一百万遍,那不还是慢吗?这种情况有没有,有!比如我有100w条记录,需要取出来,然后通过反射赋值到一个Model类中。

但是对于这种情况,如果你真是这么想的话,我只能说,你坐办公室坐久了,脑袋生锈了,该去爬爬山,泡泡妞了。如果你需要对一个对象反射一百万遍,那么你就应该缓存这个对象了。拿我们上面那个例子来说,如果这个快递员给小区的人送一百万遍的快递还认不得路,每次都还得网络地图,然后问物业管理,你丫的你还没把他开掉了,那你脑袋不是秀逗了,要不就是任性的有钱人。

上面代码如果缓存之后执行一百万遍,跟直接调用有多大的区别?我这里就不贴代码了,免得你们直接看结果没有意思,自己把代码敲一遍,印象更深刻。

那么,还有没有更快的办法,有。比如你的快递员开始用的是IPHONE4,现在可以考虑给他买个6+。在.net中,提供了Emit的相关方法来让你更快的反射。这里送你一个通过反射快速给Model赋值的轮子“Dapper”,自己回家造去。
编程中是否应该使用反射?

其实看完上面的文字,我相信你们都有了一个初步的判断,而我的看法是:绝大多数的情况下你都可以用反射。

如果你觉得是因为反射导致你程序慢的话,那么,请先用放慢镜好好观察一下,到底是不是反射的问题。如果你确定是反射的问题,那么你再好好的考虑下是不是你没有用对反射,是不是像上面那个走了一百万遍都不认识路的快递员一样。最后,如果你觉得性能上还是不够,那么我建议你升级下硬件吧,把硬件性能上升个3%总好过你请个牛逼的工程师来帮你做这种极限的优化,有一句话我觉得很对“工程师比服务器要昂贵的多”。如果你还非得跟我较劲,那么,没办法了,你程序对性能的要求已经超出了本文讨论的范畴,如果你真有这种需求了,我觉得你也没有必要看我这篇文章了,因为你已经足够牛逼到对系统语言都有深入了解了。

大多时候,我们会把程序的性能归结于编程语言,或者使用了反射等技术,而甚少去关心自己的代码,这种心态会导致你技术的发展越来越缓慢,因为你已经失去了求知的欲望,以及一颗追求技术进步的心。请你记住,更多的时候,影响我们程序性能的,是你编程的思想,你对待编码的态度!
总结

好吧,说了这么多,估计很多人直接就拖到文章末尾然后因为文章码了这么多字而默默点了个赞,那么,我在最后给大家奉献一下本文的精华:

反射大概比直接调用慢50~100倍,但是需要你在执行100万遍的时候才会有所感觉
判断一个函数的性能,你需要把这个函数执行100万遍甚至1000万遍
如果你只是偶尔调用一下反射,请忘记反射带来的性能影响
如果你需要大量调用反射,请考虑缓存。
你的编程的思想才是限制你程序性能的最主要的因素

㈤ 为什么反射能力减弱吸收,热量就会增多

反射能力减弱,意味着都被自身所吸收,那么能量也会被一起吸收,自然会增多。

㈥ 如何进行反射,如何提高反射的性能

单细胞动物神经系统对刺激的反应都由原生质来完成。腔肠动物开始有神经细胞,并形成网状,但无中枢和外周之分,当受到刺激时则引起全身反应。环节动物和节肢动物具有链状神经系统,咽部背侧一对神经节特别大,有人也把它叫做脑,这些动物有完整的反射弧,对内、外环境的刺激开始有了简单的反射活动。
脊椎动物的中枢神经系统的前端为真正脑,后端为脊髓;外周神经由脑神经和脊神经组成,其中哺乳动物出现了高度发展的大脑皮层。在高等动物以至人类,大脑皮层已成为控制整个机体活动的高级部位。中枢神经系统各结构在功能上有高级与低级之分,低级中枢可完成一些基本的、简单的反射,在高级中枢调节下反射则更加复杂而完善。
人胚发育至第3周即开始形成神经板,以后发展为神经管,再由神经管头端膨大发展为脑的不同部分,而由神经管的尾端发展成脊髓。由于胎儿神经系统的基本结构已经形成,因此初生儿就可完成一些最简单的非条件反射,如吸吮反射、吞咽反射、排尿反射、排便反射和屈肌反射等。以后由于机体不断接触外界环境,经过训练可逐渐形成越来越多的条件反射。在个体成长过程中,不断建立各种条件反射,使反射的数量越来越多,反射的形式也越来越复杂。
反射弧是反射活动的结构基础。是机体从接受刺激到发生反应的过程中兴奋在神经系统内循行的整个路径。反射一般都需要完整的反射弧来实现。一个完整的反射弧由感受器、传入神经、神经中枢、传出神经、效应器5个基本部分组成。
感受器能将内外环境的刺激转变为神经冲动的特殊结构;是反射活动的起始处。
传入神经感觉神经元的突起。将感受器的神经冲动传导到神经中枢。
神经中枢内参与某一反射活动的神经元群,是反射弧的中枢整合部分。例如参与瞳孔对光反射的中枢结构叫做对光反射中枢。简单反射的中枢范围比较局限,在神经中枢内传入神经元可直接与传出神经形成单突触联系;多数反射在传入与传出神经元之间要经过一个以上中间神经元的接替,形成多突触反射。
传出神经运动神经元的轴突。将反射中枢发生的神经冲动传到效应器。
在反射活动中,运动神经元既接受传入神经或中间神经元传入冲动的影响,又接受各级中枢下行纤维的控制。因此,它在反射传出的通路上成为最后公用的、到效应器传出路径,谢灵顿叫它做最后公路。
效应器 发生应答反应的器官或组织,包括骨骼肌、心肌和平滑肌,各种外分泌腺和一些内分泌腺等。
反射弧的5个组成部分中任何部分的中断,都会使反射消失。在某些反射活动中,传出神经首先作用于某些内分泌腺,使该腺体释放激素经血液转运,最后作用于效应器。这种有内分泌腺参与的反射活动,其效应的出现往往比较缓慢,但影响比较广泛而持久。

㈦ java反射的性能为什么低

java反射需要将内存中的对象进行解析,涉及到与底层c语言的交互,速度会比较慢。
java反射得到的每一个Method都有一个root,不暴漏给外部,而是每次一个Method。具体的反射调用逻辑是委托给MethodAccessor的,而accessor对象会在第一次invoke的时候才创建,是一种lazy init方式。而且默认Class类会cache method对象。目前MethodAccessor的实现有两种,通过设置inflation,一个native方式,一种生成java bytecode方式。native方式启动快,但运行时间长了不如java方式,个人感觉应该是java方式运行长了,jit compiler可以进行优化。所以JDK6的实现,在native方式中,有一个计数器,当调用次数达到阀值,就会转为使用java方式。默认值是15。java方式的实现,基本和非反射方式相同。

㈧ 编程语言中,既然反射机制性能又慢,又会使内部逻辑代码变得模糊。

灵活性。框架都是用来给其它开发者用的,而对于框架而言,用户需要做的任何事情框架都是不知道的,用户创建了那些类框架也不知道。比如,我们做一个MVC的框架,用户可以创建不同的Contoller,不同的Controller中又有不同的method,这时候框架根本就不知道用户有哪些Contoller和Method,那它该怎么去调用呢?每加一个Contoller或Method都去框架内去加一个case语句?显然是不可行的,框架如果能被这样改那还叫框架吗。所以正确的做法就是用反射,根据类名实例化类,根据方法名调用方法。

㈨ 物体对热辐射的吸收,反射性能与物体的哪些因素有关

1、物体在向外辐射的同时,还吸收从其他物体辐射来的能量。物体辐射或吸收的能量与它的温度、表面积、黑度等因素有关。
2、任何物体,只要温度高于
0
K
,就会不停地向周围空间发出热辐射。
3、物体对热辐射的吸收,反射性能可以在真空中传播。
4、物体对热辐射的吸收,反射性能伴随能量形式的转变。
5、物体对热辐射的吸收,反射性能具有强烈的方向性。
6、辐射能与温度和波长均有关。
7、发射辐射取决于温度的
4
次方。

㈩ 简述天线反射损耗存在或出现的原因

反射损耗与电磁波的波阻抗Zw和屏蔽材料的特征阻抗Zs有关。R=1g(Zw \ 4zs )db式中可以看出,对于特定的屏蔽材料(Zs一定),被屏蔽的电磁波的波阻抗越高,则反射损耗越大;对于确定的电磁波(Zw 一定),屏蔽材料的阻抗越低,则反射损耗越大。一.回波损耗:return loss。回波损耗是表示信号反射性能的参数。回波损耗说明入射功率的一部分被反射回到信号源。例如,如果注入1mW (0dBm)功率给放大器其中10%被反射(反弹)回来,回波损耗就是10dB。从数学角度看,回波损耗为-10 log [(反射功率)/(入射功率)]。回波损耗通常在输入和输出都进行规定。
二.传输损耗
传输损耗是指在传输过程中因传输介质等因素引起的能力损失。
无线信道空间传输损耗
超高频和微波波段信号的空间传播,会对信号带来多种传损伤、很大衰减和多径衰落。
1.直线传播损伤
● 衰减和失真;
● 自由空间损耗;
● 噪声;
● 大气吸收;
● 多径和折射。
2.衰减因素
双绞线、电缆到光纤、波导等传输媒体,都是导向媒体,而在自由空间长距离的电磁波传播,属于非导向媒体传输;因此衰减是较为复杂的距离函数,并在地球周围受到充满大气层的影响。传播衰减主要影响因素是:传播频段f,传播距离L,电磁波速率C(近于光速)。
自由空间传播损耗
1. 微波段信号远程传播如卫星到地面约36000km。信号波束随传播距离而发散。上行链路的发射信号功率,由大功率速调管可达上千瓦,而卫星转发器只能靠太阳能供电,由于卫星表面积受限,因此下行链路发射功率很难达到上百瓦。因此地球站接收信号功率不过微瓦级,并且还包含了收、发天线增益几十个dB的补偿效果。
2. 空间传播损耗(dB)
多径传播和多径衰落
1.多径传播
天线辐射的信号以三种方式传播:地波、天波和空间波(后者即称谓的直线波);
● 当电磁波遇有比其波长要大的障碍物时,则发生反射;
● 并在该物体边界进行衍射(绕射);
● 若障碍物尺寸不大于电磁波长,会发生散射,即散射几路弱信号———多径衰落。
2.多径传播后果
● 多径到达的信号,由于相位不同,强弱相差很大,若无序混迭、相位抵消,就使接收信号难以检测与恢复质量良好的信息;
● 产生严重的码间干拢(ISI);
● 特别是在较高速度的移动台天线发出的信号,运动方向、障碍物环境较快变化,多径信号中主路径不稳定等因素导致的接收信号更难处理。
3.衰落类型
● 慢衰落(平坦衰落—flat fading);
● 快衰落(fast fading);
● 选择性衰落(Selective fading)。
4.衰落信道的3种类型
● 高斯信道———是最简单的信道模型,同时它更符合于通信恒参传输媒体。本书各种传输系统,均是基于高斯信道进行性能分析。
● 瑞利衰落信道———多径衰落导致多条均很弱的路径信号,而不存在一条主路径。
● 赖斯衰落信道———是较瑞利衰落利于处理的情况,它具有明显的主路径和多个较弱的间接路径。
5.多径衰落环境下的信号接收
● 选用适当的分集技术与合并处理
● 自适应均衡
● 前向纠错编码
● 高性能传输技术———如TCM,复合编码,OFDM等
电波在自由空间传播的损耗公式为:
Lbs(dB) = 32.45 + 20lgf(MHz) + 20lgd(km)
式中,Lbs为自由空间的路径传播损耗,它与收发天线增益Gr、Gt无关,仅与传输路径有关。如果将其他参数保持不变,仅使工作频率f(或传输距离d)提高一倍,则其自由空间的路径损耗就增加6dB。
对于WLAN,工作在2.4GHz,在自由空间中传播损耗为(f = 2400MHz):
Lbs = 100 + 20lgd(km)
Lbs = 100 + 20lgd(km)
距离(m) 1 5 20 30 40 50 80 100
损耗(dB) 40 54 66 70 72 74 78 80
而实际中,电波还要受到诸如地面的吸收、反射、障碍物的阻挡等影响。在室内的障碍物通常为墙壁、隔断、地板等。障碍物对电波的阻挡效果与障碍物的结构有关,木质结构的损耗为5dB,钢筋混凝土结构的损耗为25dB。
以型号FH-AP2400的无线接入节点设备和FH-325的无线PCMCIA网卡为例,分析AP在室内覆盖范围的大小。
为分析简单起见,只考虑空间传播和障碍物(墙壁、隔断、地板)阻挡对电波的损耗。下表列出了电波通过不同的障碍物后FH-AP2400(ISP)的有效覆盖距离。
上表的数据是根据AP工作在11Mbps时的灵敏度计算得到的。当AP工作在更低的速率(5.5/2/1Mbps)时,有效覆盖距离还可以更大。

热点内容
为什么系统不提供安装软件 发布:2025-05-17 07:31:09 浏览:150
冬天的时候乌龟为什么不吃东西 发布:2025-05-17 07:31:09 浏览:249
为什么有好友的微信朋友圈不显示 发布:2025-05-17 07:26:54 浏览:443
痛风为什么到晚上这么疼 发布:2025-05-17 07:26:49 浏览:880
超市里的辣条为什么那么便宜 发布:2025-05-17 07:19:06 浏览:215
暧聊软件为什么有搭讪红包 发布:2025-05-17 07:08:50 浏览:681
医院的降压药为什么比药店便宜 发布:2025-05-17 07:08:12 浏览:9
为什么找不到高清通话设置 发布:2025-05-17 06:56:28 浏览:287
喝酒为什么喝多了眼睛有泪 发布:2025-05-17 06:53:10 浏览:318
淘宝小店服务和物流为什么会下降 发布:2025-05-17 06:50:01 浏览:990