當前位置:首頁 » 便宜好貨 » 為什麼反射性能不好

為什麼反射性能不好

發布時間: 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-16 20:03:07 瀏覽:699
蘋果手機為什麼比高配還流暢 發布:2025-05-16 20:01:42 瀏覽:995
孩子感冒好了後為什麼咳嗽 發布:2025-05-16 19:36:35 瀏覽:818
淘寶為什麼不顯示 發布:2025-05-16 19:31:20 瀏覽:619
屬兔87為什麼找不到愛情 發布:2025-05-16 19:19:13 瀏覽:850
為什麼老人晚上會突然身上發癢 發布:2025-05-16 19:12:29 瀏覽:614
為什麼原裝屏顏色比較淡 發布:2025-05-16 19:12:28 瀏覽:977
為什麼男人活著要有尊嚴 發布:2025-05-16 19:11:42 瀏覽:67
男生戀愛為什麼會小心翼翼 發布:2025-05-16 19:11:38 瀏覽:702
為什麼晚上睡不著覺吃不下飯 發布:2025-05-16 19:05:26 瀏覽:324