亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

不小心被Cglib忽悠了(已糾正錯誤2009-3-1)

系統 1594 0
最新添加(2009-3-1),糾正文章錯誤 http://www.iteye.com/topic/336082
引用
真心接受批評,并感謝 sdh5724 指正。
好久沒看這個貼了,用 sdh5724? 提醒的方式 beanCopier 復制,效率很高,是標準Java反射調用的 1/5.

10000次對象復制測試結果(ms):
task 直接復制????????????????? 31
task java標準反射復制????????? 610
task cglib Fast復制(不好的寫法) 890
task cglib beancopier復制??? 125


原帖

1. 背景???? 大家都知道,Java的反射調用性能要遠低于直接對象調用,一般慢10-20倍多,但很多地方反射調用又是必須的,例如:BeanUtils.copyValues,ORM框架底層等對象映射創建等。因此有的開源框架通過asm等代碼生成方式來優化Java反射調用的性能。
??? cglib中提供了Fast反射功能,包括FastClass,FastMethod等,替代 Java的標準實現,以圖提高性能。

2. 問題
?? 但我在實測中發現,cglib的Fast反射框架性能反而不如 JDK的標準反射實現.
?? 測試用例:對ManageLogVO的兩個實例進行copyValue,其中第一個是標準方式創建和復制,第二個通過反射方式創建和賦值。
?? 分別采用 Java直接對象操作: testCopyValue();
??????????? JDK標準反射調用,? testCopyValueUseReflection();
??????????? Cglib Fast反射:??? testCopyValueUseCglib();
? 執行10000次,盡量模擬真實環境情況。

3. 測試結果
?? 下面是實測結果,記錄執行10000次總耗用時間:
? testCopyValue????????????? 31ms
? testCopyValueUseReflection 609ms
? testCopyValueUseCglib????? 922ms

? 反射耗時是直接操作的20倍,Fast反射更是對象直接操作的30倍。

4 代碼片段:
1) 直接操作(共8個屬性操作,限于篇幅只列出2個):
     ManagelogVO newVO = new ManagelogVO();
		newVO.setLogid(managelogVO.getLogid());
		newVO.setOprcode(managelogVO.getOprcode());
  


2) JDK 反射
    Object o  = null;
		try {
			Class clazz = Class.forName("demo.cglib.ManagelogVO");
			o = clazz.newInstance();
			Method setterMethod = null;
			Method getterMethod = null;
			Object v = null;
			
			setterMethod = clazz.getMethod("setLogid", new Class[]{Long.class});
			getterMethod = clazz.getMethod("getLogid", null);			
			v = getterMethod.invoke(managelogVO, null);
			setterMethod.invoke(o, new Object[]{v});
			
			setterMethod = clazz.getMethod("setOprcode", new Class[]{String.class});
			getterMethod = clazz.getMethod("getOprcode", null);			
			v = getterMethod.invoke(managelogVO, null);
			setterMethod.invoke(o, new Object[]{v});
  


? 3) Cglib Fast反射
      Object o  = null;
		try {
			Class clazz0 = Class.forName("demo.cglib.ManagelogVO");
//			
			FastClass clazz = FastClass.create(clazz0);			
			o = clazz.newInstance();
			FastMethod setterMethod = null;
			FastMethod getterMethod = null;
			Object v = null;
			
			setterMethod = clazz.getMethod("setLogid", new Class[]{Long.class});
			getterMethod = clazz.getMethod("getLogid", null);			
			v = getterMethod.invoke(managelogVO, new Object[]{});
			setterMethod.invoke(o, new Object[]{v});
			
			setterMethod = clazz.getMethod("setOprcode", new Class[]{String.class});
			getterMethod = clazz.getMethod("getOprcode", null);			
			v = getterMethod.invoke(managelogVO, new Object[]{});
			setterMethod.invoke(o, new Object[]{v});
  


? 通過JProfiler分析,結果類似,并且可以發現 FastClass.getMethod(), FastClass.create(),FastMethod.invoke() 分別是耗時大戶,造成性能低下。



5 優化建議:
??? 我的測試用例,基本模擬了真實ORM框架下的一些操作。instance每次創建,method每次都要查找,而由于 getMethod是性能消耗的主要地方,因此,可以考慮對Method做緩存處理,無論對于 JDK反射還是 Cglib fast反射都有一倍以上的性能提高。
??

不小心被Cglib忽悠了(已糾正錯誤2009-3-1)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本免费一区二区三区a区 日本免费一区二区三区看片 | 亚洲国产美女精品久久 | 久久香蕉国产线看观看亚洲卡 | 中文字幕波多野不卡一区 | 国产精品国产精品国产专区不卡 | 麻豆国产精品视频 | 日日摸夜夜添夜夜添一区二区 | 高清视频一区二区 | 免费观看欧美精品成人毛片能看的 | 亚洲综合网址 | 老子影院伦不卡欧美 | 99国产精品九九视频免费看 | 香蕉成人啪国产精品视频综合网 | 伊人二区 | 亚洲精品资源在线 | 草久久免费视频 | 国产精品九九热 | 国产乱码精品一区二区三区四川 | 欧美成人aaaaa免费视频 | 欧美一区二区三区视频 | 青草视频网址 | 天天舔天天操天天干 | 久久精品国产400部免费看 | 日韩在线观看中文字幕 | 婷婷色视频 | 欧美在线一级视频 | 涩涩在线 | 99热久久这里只有精品 | 国产精品主播在线 | aaa级片 | 亚洲综合日韩在线亚洲欧美专区 | 日韩精品区| 91国内精品久久久久怡红院 | 国产国产成人人免费影院 | 91在线播放视频 | 久国产精品久久精品国产四虎 | 高清欧美一区二区三区 | 中文字幕日韩在线一区国内 | 精品视频在线播放 | 五月天婷婷在线观看 | 中文精品久久久久中文 |