91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么提高Java中反射的效率

發布時間:2020-12-19 14:41:40 來源:億速云 閱讀:360 作者:Leah 欄目:開發技術

這篇文章給大家介紹怎么提高Java中反射的效率,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

準備測試對象

下面先定義一個測試的類TestUser,只有id跟name屬性,以及它們的getter/setter方法,另外還有一個自定義的sayHi方法。

public class TestUser { private Integer id; private String name; 

 public String sayHi(){  return "hi";

 } public Integer getId() {  return id;

 } public void setId(Integer id) {  this.id = id;

 } public String getName() {  return name;

 } public void setName(String name) {  this.name = name;

 }

}

測試創建100萬個對象

// 通過普通方式創建TestUser對象@Testpublic void testCommon(){ long start = System.currentTimeMillis();

 TestUser user = null; int i = 0; while(i<1000000){

  ++i;

  user = new TestUser();

 } long end = System.currentTimeMillis();

 System.out.println("普通對象創建耗時:"+(end - start ) + "ms");

}//普通對象創建耗時:10ms
// 通過反射方式創建TestUser對象@Testpublic void testReflexNoCache() throws Exception { long start = System.currentTimeMillis();

 TestUser user = null; int i = 0; while(i<1000000){

  ++i;

  user = (TestUser) Class.forName("ReflexDemo.TestUser").newInstance();

 } long end = System.currentTimeMillis();

 System.out.println("無緩存反射創建對象耗時:"+(end - start ) + "ms");

}//無緩存反射創建對象耗時:926ms

在上面這兩個測試方法中,筆者各自測了5次,把他們消耗的時間取了一個平均值,在輸出結果中可以看到一個是10ms,一個是926ms,在創建100W個對象的情況下,反射居然慢了90倍左右。wtf?差距居然這么大?難道反射真的這么慢?下面筆者換一種反射的姿勢,繼續測試一下,看看結果如何

// 通過緩存反射方式創建TestUser對象@Testpublic void testReflexWithCache() throws Exception { long start = System.currentTimeMillis();

 TestUser user = null;

 Class rUserClass = Class.forName("RefleDemo.TestUser"); int i = 0; while(i<1000000){

  ++i;

  user = (TestUser) rUserClass.newInstance();

 } long end = System.currentTimeMillis();

 System.out.println("通過緩存反射創建對象耗時:"+(end - start ) + "ms");

}//通過緩存反射創建對象耗時:41ms

其實通過代碼我們可以發現,是Class.forName這個方法比較耗時,它實際上調用了一個本地方法,通過這個方法來要求JVM查找并加載指定的類。所以我們在項目中使用的時候,可以把Class.forName返回的Class對象緩存起來,下一次使用的時候直接從緩存里面獲取,這樣就極大的提高了獲取Class的效率。同理,在我們獲取Constructor、Method等對象的時候也可以緩存起來使用,避免每次使用時再來耗費時間創建。

測試反射調用方法

@Testpublic void testReflexMethod() throws Exception { long start = System.currentTimeMillis();

 Class testUserClass = Class.forName("RefleDemo.TestUser");

 TestUser testUser = (TestUser) testUserClass.newInstance();

 Method method = testUserClass.getMethod("sayHi"); int i = 0; while(i<100000000){

  ++i;

  method.invoke(testUser);

 } long end = System.currentTimeMillis();

 System.out.println("反射調用方法耗時:"+(end - start ) + "ms");

}//反射調用方法耗時:330ms
@Testpublic void testReflexMethod() throws Exception { long start = System.currentTimeMillis();

 Class testUserClass = Class.forName("RefleDemo.TestUser");

 TestUser testUser = (TestUser) testUserClass.newInstance();

 Method method = testUserClass.getMethod("sayHi"); int i = 0; while(i<100000000){

  ++i;

  method.setAccessible(true);

  method.invoke(testUser);

 } long end = System.currentTimeMillis();

 System.out.println("setAccessible=true 反射調用方法耗時:"+(end - start ) + "ms");

}//setAccessible=true 反射調用方法耗時:188ms

這里我們反射調用sayHi方法1億次,在調用了method.setAccessible(true)后,發現快了將近一半。查看API可以了解到,jdk在設置獲取字段,調用方法的時候會執行安全訪問檢查,而此類操作會比較耗時,所以通過setAccessible(true)的方式可以關閉安全檢查,從而提升反射效率。

極致的反射

除了上面的手段,還有沒有什么辦法可以更極致的使用反射呢?這里介紹一個高性能反射工具包ReflectASM。它是通過字節碼生成的方式來實現的反射機制,下面是一個跟java反射的性能比較。

怎么提高Java中反射的效率

關于怎么提高Java中反射的效率就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

隆化县| 武冈市| 元朗区| 常熟市| 巴东县| 陕西省| 绵阳市| 临泉县| 赤城县| 禄丰县| 靖安县| 武安市| 井研县| 铁岭县| 东至县| 黑水县| 日喀则市| 墨玉县| 交口县| 莱州市| 长沙县| 汉寿县| 肇庆市| 齐河县| 南平市| 西乌珠穆沁旗| 澄江县| 惠州市| 吴桥县| 天水市| 武定县| 溆浦县| 常山县| 克拉玛依市| 卢湾区| 富源县| 瓦房店市| 安岳县| 五常市| 陕西省| 读书|