精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java反射到底慢在哪?

開發 后端
所以最有可能產生性能差異的只有getMethod和getDeclaredField、invoke和set方法了,下面分別就這兩組方法進行測試,找到具體慢在哪。

 反射具體是怎么影響性能的?這引起了我的反思。是啊,在闡述某個觀點時確實有必要說明原因,并且證明這個觀點是對的,雖然反射影響性能人盡皆知,我曾經也真的研究過反射是否存在性能問題,但并沒有在寫文章的時候詳細說明。這讓我想到網上很多信息只會告訴你結論,并不會說明原因,導致很多學到的東西都是死記硬背,而不是真正掌握,別人一問或者自己親身遇到同樣的問題時,傻眼了。

反射真的存在性能問題嗎?

還是使用上篇文章的demo,為了放大問題,找到共性,采用逐漸擴大測試次數、每次測試多次取平均值的方式,針對同一個方法分別就直接調用該方法、反射調用該方法、直接調用該方法對應的實例、反射調用該方法對應的實例分別從1-1000000,每隔一個數量級測試一次:

測試代碼如下(Person、ICompany、ProgramMonkey這三個類已在之前的文章中貼出): 

  1. public class ReflectionPerformanceActivity extends Activity{  
  2.     private TextView mExecuteResultTxtView = null 
  3.     private EditText mExecuteCountEditTxt = null 
  4.     private Executor mPerformanceExecutor = Executors.newSingleThreadExecutor();  
  5.     private static final int AVERAGE_COUNT = 10 
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState){  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_reflection_performance_layout);  
  10.         mExecuteResultTxtView = (TextView)findViewById(R.id.executeResultTxtId);  
  11.         mExecuteCountEditTxt = (EditText)findViewById(R.id.executeCountEditTxtId);  
  12.     }  
  13.     public void onClick(View v){  
  14.         switch(v.getId()){  
  15.             case R.id.executeBtnId:{  
  16.                 execute();  
  17.             }  
  18.             break;  
  19.             default:{ 
  20.             }  
  21.             break;  
  22.         }  
  23.     }  
  24.     private void execute(){  
  25.         mExecuteResultTxtView.setText("");  
  26.         mPerformanceExecutor.execute(new Runnable(){  
  27.             @Override  
  28.             public void run(){  
  29.                 long costTime = 0 
  30.                 int executeCount = Integer.parseInt(mExecuteCountEditTxt.getText().toString());  
  31.                 long reflectMethodCostTime=0,normalMethodCostTime=0,reflectFieldCostTime=0,normalFieldCostTime=0 
  32.                 updateResultTextView(executeCount + "毫秒耗時情況測試");  
  33.                 for(int index = 0; index < AVERAGE_COUNT; index++){  
  34.                     updateResultTextView("第 " + (index+1) + " 次");  
  35.                     costTime = getNormalCallCostTime(executeCount);  
  36.                     reflectMethodCostTime += costTime;  
  37.                     updateResultTextView("執行直接調用方法耗時:" + costTime + " 毫秒");  
  38.                     costTime = getReflectCallMethodCostTime(executeCount);  
  39.                     normalMethodCostTime += costTime;  
  40.                     updateResultTextView("執行反射調用方法耗時:" + costTime + " 毫秒");  
  41.                     costTime = getNormalFieldCostTime(executeCount);  
  42.                     reflectFieldCostTime += costTime;  
  43.                     updateResultTextView("執行普通調用實例耗時:" + costTime + " 毫秒");  
  44.                     costTime = getReflectCallFieldCostTime(executeCount);  
  45.                     normalFieldCostTime += costTime;  
  46.                     updateResultTextView("執行反射調用實例耗時:" + costTime + " 毫秒");  
  47.                 }  
  48.                 updateResultTextView("執行直接調用方法平均耗時:" + reflectMethodCostTime/AVERAGE_COUNT + " 毫秒");  
  49.                 updateResultTextView("執行反射調用方法平均耗時:" + normalMethodCostTime/AVERAGE_COUNT + " 毫秒");  
  50.                 updateResultTextView("執行普通調用實例平均耗時:" + reflectFieldCostTime/AVERAGE_COUNT + " 毫秒");  
  51.                 updateResultTextView("執行反射調用實例平均耗時:" + normalFieldCostTime/AVERAGE_COUNT + " 毫秒");  
  52.             }  
  53.         });  
  54.     }  
  55.     private long getReflectCallMethodCostTime(int count){  
  56.         long startTime = System.currentTimeMillis();  
  57.         for(int index = 0 ; index < count; index++){  
  58.             ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  59.             try{  
  60.                 Method setmLanguageMethod = programMonkey.getClass().getMethod("setmLanguage", String.class);  
  61.                 setmLanguageMethod.setAccessible(true);  
  62.                 setmLanguageMethod.invoke(programMonkey, "Java");  
  63.             }catch(IllegalAccessException e){  
  64.                 e.printStackTrace();  
  65.             }catch(InvocationTargetException e){  
  66.                 e.printStackTrace();  
  67.             }catch(NoSuchMethodException e){  
  68.                 e.printStackTrace();  
  69.             }  
  70.         }  
  71.         return System.currentTimeMillis()-startTime;  
  72.     }  
  73.     private long getReflectCallFieldCostTime(int count){  
  74.         long startTime = System.currentTimeMillis();  
  75.         for(int index = 0 ; index < count; index++){  
  76.             ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  77.             try{  
  78.                 Field ageField = programMonkey.getClass().getDeclaredField("mLanguage");  
  79.                 ageField.set(programMonkey, "Java");  
  80.             }catch(NoSuchFieldException e){  
  81.                 e.printStackTrace();  
  82.             }catch(IllegalAccessException e){  
  83.                 e.printStackTrace();  
  84.             }  
  85.         }  
  86.         return System.currentTimeMillis()-startTime;  
  87.     }  
  88.     private long getNormalCallCostTime(int count){  
  89.         long startTime = System.currentTimeMillis();  
  90.         for(int index = 0 ; index < count; index++){  
  91.             ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  92.             programMonkey.setmLanguage("Java");  
  93.         }  
  94.         return System.currentTimeMillis()-startTime;  
  95.     }  
  96.     private long getNormalFieldCostTime(int count){  
  97.         long startTime = System.currentTimeMillis();  
  98.         for(int index = 0 ; index < count; index++){  
  99.             ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  100.             programMonkey.mLanguage = "Java" 
  101.         }  
  102.         return System.currentTimeMillis()-startTime;  
  103.     }  
  104.     private void updateResultTextView(final String content){  
  105.         ReflectionPerformanceActivity.this.runOnUiThread(new Runnable(){  
  106.             @Override  
  107.             public void run(){  
  108.                 mExecuteResultTxtView.append(content);  
  109.                 mExecuteResultTxtView.append("\n");  
  110.             }  
  111.         });  
  112.     }  

測試結果如下:

反射性能測試結果

測試結論:

  •  反射的確會導致性能問題;
  •  反射導致的性能問題是否嚴重跟使用的次數有關系,如果控制在100次以內,基本上沒什么差別,如果調用次數超過了100次,性能差異會很明顯;
  •  四種訪問方式,直接訪問實例的方式效率最高;其次是直接調用方法的方式,耗時約為直接調用實例的1.4倍;接著是通過反射訪問實例的方式,耗時約為直接訪問實例的3.75倍;最慢的是通過反射訪問方法的方式,耗時約為直接訪問實例的6.2倍;

反射到底慢在哪?

跟蹤源碼可以發現,四個方法中都存在實例化ProgramMonkey的代碼,所以可以排除是這句話導致的不同調用方式產生的性能差異;通過反射調用方法中調用了setAccessible方法,但該方法純粹只是設置屬性值,不會產生明顯的性能差異;所以最有可能產生性能差異的只有getMethod和getDeclaredField、invoke和set方法了,下面分別就這兩組方法進行測試,找到具體慢在哪?

首先測試invoke和set方法,修改getReflectCallMethodCostTime和getReflectCallFieldCostTime方法的代碼如下: 

  1. private long getReflectCallMethodCostTime(int count){  
  2.       long startTime = System.currentTimeMillis();  
  3.       ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  4.       Method setmLanguageMethod = null 
  5.       try{ 
  6.            setmLanguageMethod = programMonkey.getClass().getMethod("setmLanguage", String.class);  
  7.           setmLanguageMethod.setAccessible(true);  
  8.       }catch(NoSuchMethodException e){  
  9.           e.printStackTrace();  
  10.       }  
  11.       for(int index = 0 ; index < count; index++){  
  12.           try{  
  13.               setmLanguageMethod.invoke(programMonkey, "Java");  
  14.           }catch(IllegalAccessException e){  
  15.               e.printStackTrace();  
  16.           }catch(InvocationTargetException e){  
  17.               e.printStackTrace();  
  18.           }  
  19.       }  
  20.       return System.currentTimeMillis()-startTime;  
  21.   }  
  22.   private long getReflectCallFieldCostTime(int count){  
  23.       long startTime = System.currentTimeMillis();  
  24.       ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  25.       Field ageField = null 
  26.       try{  
  27.           ageField = programMonkey.getClass().getDeclaredField("mLanguage");  
  28.       }catch(NoSuchFieldException e){  
  29.           e.printStackTrace();  
  30.       }  
  31.       for(int index = 0 ; index < count; index++){  
  32.           try{  
  33.               ageField.set(programMonkey, "Java");  
  34.           }catch(IllegalAccessException e){  
  35.               e.printStackTrace();  
  36.           }  
  37.       }  
  38.       return System.currentTimeMillis()-startTime;  
  39.   } 

沿用上面的測試方法,測試結果如下:

invoke和set

修改getReflectCallMethodCostTime和getReflectCallFieldCostTime方法的代碼如下,對getMethod和getDeclaredField進行測試: 

  1. private long getReflectCallMethodCostTime(int count){  
  2.     long startTime = System.currentTimeMillis();  
  3.     ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  4.     for(int index = 0 ; index < count; index++){  
  5.         try{  
  6.             Method setmLanguageMethod = programMonkey.getClass().getMethod("setmLanguage", String.class);  
  7.         }catch(NoSuchMethodException e){  
  8.             e.printStackTrace();  
  9.         }  
  10.     }  
  11.     return System.currentTimeMillis()-startTime;  
  12.  
  13. private long getReflectCallFieldCostTime(int count){  
  14.     long startTime = System.currentTimeMillis();  
  15.     ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12);  
  16.     for(int index = 0 ; index < count; index++){  
  17.         try{  
  18.             Field ageField = programMonkey.getClass().getDeclaredField("mLanguage");  
  19.         }catch(NoSuchFieldException e){  
  20.             e.printStackTrace();  
  21.         } 
  22.     }  
  23.     return System.currentTimeMillis()-startTime; 

沿用上面的測試方法,測試結果如下:

getMethod和getDeclaredField

測試結論:

  •  getMethod和getDeclaredField方法會比invoke和set方法耗時;
  •  隨著測試數量級越大,性能差異的比例越趨于穩定;

由于測試的這四個方法最終調用的都是native方法,無法進一步跟蹤。個人猜測應該是和在程序運行時操作class有關,比如需要判斷是否安全?是否允許這樣操作?入參是否正確?是否能夠在虛擬機中找到需要反射的類?主要是這一系列判斷條件導致了反射耗時;也有可能是因為調用natvie方法,需要使用JNI接口,導致了性能問題(參照Log.java、System.out.println,都是調用native方法,重復調用多次耗時很明顯)。

如果避免反射導致的性能問題? 

通過上面的測試可以看出,過多地使用反射,的確會存在性能問題,但如果使用得當,所謂反射導致性能問題也就不是問題了,關于反射對性能的影響,參照下面的使用原則,并不會有什么明顯的問題:

  •  不要過于頻繁地使用反射,大量地使用反射會帶來性能問題;
  •  通過反射直接訪問實例會比訪問方法快很多,所以應該優先采用訪問實例的方式。

后記

上面的測試并不全面,但在一定程度上能夠反映出反射的確會導致性能問題,也能夠大概知道是哪個地方導致的問題。如果后面有必要進一步測試,我會從下面幾個方面作進一步測試:

  •  測試頻繁調用native方法是否會有明顯的性能問題;
  •  測試同一個方法內,過多的條件判斷是否會有明顯的性能問題;
  •  測試類的復雜程度是否會對反射的性能有明顯影響 

 

責任編輯:龐桂玉 來源: Java編程
相關推薦

2024-04-15 04:00:00

C#反射代碼

2024-06-04 00:00:30

C#反射編程

2016-12-28 11:28:19

.NET反射

2021-02-26 07:17:47

MySQLMariaDB

2014-01-07 13:54:40

Hadoop日志

2025-10-29 00:00:00

光通信AI人工智能

2024-11-05 09:32:47

2017-06-22 16:18:58

IBM光譜存儲軟件定義存儲

2020-12-31 09:06:44

Go語言Reflect

2015-09-02 09:56:33

大數據

2024-04-11 13:23:07

2020-04-30 11:11:30

MySQLMGR數據庫

2015-06-30 14:33:52

物聯網

2012-09-13 14:11:07

Windows Ser微軟云平臺

2020-08-06 09:08:51

開發谷歌微軟

2021-10-08 14:43:24

WiFi 5WiFi 6遠程

2023-06-27 17:30:13

數字化

2017-03-16 14:31:11

2025-05-22 09:15:09

2022-03-29 14:46:03

元宇宙工業元宇宙物聯網
點贊
收藏

51CTO技術棧公眾號

午夜视频一区在线观看| 国产乱妇无码大片在线观看| 精品亚洲一区二区| 亚洲成人福利在线观看| 黄色视屏免费在线观看| 国产精品一区二区在线看| 午夜精品久久久久久99热| 免费污网站在线观看| 亚洲tv在线| 欧美日韩日本国产| 亚洲日本精品| 少妇人妻精品一区二区三区| 青青草成人在线观看| 欧美激情一区二区三级高清视频| 特级西西www444人体聚色| 日韩欧洲国产| 在线观看日韩电影| 国产精品视频一二三四区| 国产亚洲依依| 成人av在线资源网站| 国产欧亚日韩视频| 国产美女激情视频| 亚洲天堂免费| 亚洲免费av片| 高清中文字幕mv的电影| 欧美黄页在线免费观看| 一本色道综合亚洲| 日韩xxxx视频| 2020国产在线视频| 中文字幕第一区第二区| 九九九久久久| 蜜臀久久久久久999| 久久成人18免费观看| 国产v综合ⅴ日韩v欧美大片| 国产小视频在线免费观看| 一区二区电影| 久久久av网站| av在线免费播放网址| 欧美日韩一二| 亚洲人在线视频| 精品久久久久久中文字幕人妻最新| 国产一区一区| 91精品国产综合久久香蕉麻豆| 熟女少妇精品一区二区| 欧美特大特白屁股xxxx| 欧美色图在线视频| 青青艹视频在线| 国产高清自产拍av在线| 亚洲最新在线观看| 久久亚洲a v| 污污的网站在线看| 亚洲黄色录像片| 黄色特一级视频| 羞羞的视频在线看| 一区二区三区美女视频| 成年丰满熟妇午夜免费视频| 国产在线看片| 亚洲精品少妇30p| 日韩视频一二三| 日本一本在线免费福利| 一区二区三区四区不卡视频| 国产主播自拍av| 擼擼色在线看观看免费| 欧美性jizz18性欧美| 777久久久精品一区二区三区 | 日韩在线视频观看正片免费网站| 国产一二三四区在线| 欧美丰满老妇| 久久亚洲精品国产亚洲老地址| 国产精品三区在线观看| 狠狠入ady亚洲精品经典电影| 高清视频欧美一级| 国产性猛交╳xxx乱大交| 日日嗨av一区二区三区四区| 国产精品久久91| 91国偷自产中文字幕久久| 日本aⅴ精品一区二区三区| 国产精品爽爽爽| 国产乱人乱偷精品视频| 丁香激情综合五月| 欧美日韩亚洲一区二区三区四区| 草碰在线视频| 亚洲免费观看在线观看| 日本中文字幕网址| 嫩草伊人久久精品少妇av杨幂| 欧美日韩成人综合在线一区二区| 国产探花一区二区三区| 色婷婷综合久久久久久| 精品国产一区二区在线| 欧美老熟妇一区二区三区| 国产亚洲在线| 国产色视频一区| 人妻视频一区二区三区| 国产女主播视频一区二区| 青青草原网站在线观看| 午夜影院在线播放| 9191成人精品久久| 肉丝美足丝袜一区二区三区四| 啪啪激情综合网| 久久影视电视剧免费网站清宫辞电视 | 欧美日韩国产999| 成人免费毛片视频| 国产精品一区免费在线观看| 日本一区二区三区www| 在线观看操人| 欧美午夜精品理论片a级按摩| 国产调教打屁股xxxx网站| 精品理论电影在线| 欧美精品激情在线| 国产又粗又猛视频免费| 91碰在线视频| 日韩不卡视频一区二区| 亚洲精品粉嫩美女一区| 日韩电影大全免费观看2023年上| 免费在线观看h片| 日日摸夜夜添夜夜添亚洲女人| 成人av播放| 久久99精品久久久久久野外| 欧美在线一区二区| 一女三黑人理论片在线| 国产一区久久| 成人免费xxxxx在线观看| 国产高清在线看| 天天综合色天天综合色h| av在线免费观看不卡| 欧美丝袜丝交足nylons172| 欧美一区在线直播| 好男人www在线视频| 日韩美女视频一区| 三级av免费观看| 加勒比久久综合| 热久久免费视频精品| 欧美一区二区黄片| 一区二区三区日韩欧美精品| 亚洲精品国产一区二区三区| 日韩欧美电影| 国产精品美女www| youjizz在线播放| 91福利国产精品| 免费看污片网站| 久久男女视频| 欧美日韩一区在线观看视频| 忘忧草在线日韩www影院| 亚洲大胆美女视频| 国产中文字幕免费| 国产69精品久久久久777| 日韩精品久久一区二区| 日韩国产在线不卡视频| 欧美成人久久久| 国产成人精品a视频| 亚洲免费观看高清完整版在线观看 | 日本少妇全体裸体洗澡| 成人aaaa免费全部观看| 亚洲熟妇无码另类久久久| 激情小说亚洲色图| 555www成人网| 精品欧美不卡一区二区在线观看 | 国产精品久久久午夜夜伦鲁鲁| 中文字幕一区二区不卡| 日韩av加勒比| 欧美片第1页综合| 国内精品久久久久久久果冻传媒| av免费在线视| 亚洲女人被黑人巨大进入al| 日韩国产成人在线| 国产精品福利一区二区三区| 久久久久亚洲av无码麻豆| 红桃视频亚洲| 欧美日本韩国一区二区三区| 精品福利在线| 欧美另类在线播放| 污污网站在线免费观看| 色8久久人人97超碰香蕉987| 极品蜜桃臀肥臀-x88av| 国产乱子伦视频一区二区三区| 国产精品69久久久| 欧美欧美黄在线二区| 国产日韩欧美在线观看| 久久免费电影| 亚洲欧美资源在线| 国产又粗又猛又黄又爽无遮挡| 亚洲一区二区三区四区在线| 精品人妻一区二区三区香蕉| 秋霞国产午夜精品免费视频| 91精品国产毛片武则天| 全球av集中精品导航福利| 国产精品久久久一区| 怡红院红怡院欧美aⅴ怡春院| 日韩av在线一区| 91超薄丝袜肉丝一区二区| 亚洲超碰97人人做人人爱| 免费看91的网站| 国产成人免费视频| 性生交免费视频| 欧美一区成人| 日韩视频精品| 哺乳挤奶一区二区三区免费看| 国产精品电影在线观看| 任你弄在线视频免费观看| 亚洲欧洲一区二区三区在线观看 | 日韩精品极品毛片系列视频| 91激情在线观看| 欧美午夜无遮挡| 男人操女人的视频网站| 国产日韩欧美精品电影三级在线| 无码人妻aⅴ一区二区三区玉蒲团| 天堂成人免费av电影一区| 91亚洲精品国产| 欧美激情国产在线| 另类小说综合网| 超碰成人97| 成人免费视频网址| 一二区成人影院电影网| 性欧美xxxx| 伊人福利在线| xx视频.9999.com| 黄色毛片在线观看| 亚洲国产精品福利| 国产福利资源在线| 欧美日本精品一区二区三区| 久久夜色精品国产噜噜亚洲av| 亚洲精品视频观看| 国产免费一区二区三区四区| 久久精品欧美日韩精品| 国产chinese中国hdxxxx| 国产精品综合av一区二区国产馆| 三上悠亚av一区二区三区| 久久精品午夜| 欧美日本视频在线观看| 亚洲九九精品| 国产二区视频在线| 国产精品av一区二区| 日本黄xxxxxxxxx100| 婷婷精品进入| 男女激烈动态图| 亚洲色图二区| 特级黄色录像片| 亚洲第一天堂| 韩国黄色一级大片| 亚洲成人三区| 久操手机在线视频| 欧美午夜一区| 国产真人做爰毛片视频直播 | 国产精品你懂的在线欣赏| 亚洲成人黄色av| 亚洲国产精品ⅴa在线观看| 天天躁夜夜躁狠狠是什么心态| 国产视频一区二区在线| 性欧美精品男男| 国产三级久久久| 东方伊人免费在线观看| 中文字幕成人av| 任我爽在线视频| 亚洲精品久久嫩草网站秘色| 青娱乐国产盛宴| 亚洲v中文字幕| 91video| 日本乱人伦一区| 免费黄色一级大片| 91精品国产色综合久久不卡电影| 国产男男gay体育生网站| 日韩欧美国产系列| 日本韩国免费观看| 亚洲欧美日韩中文视频| 岛国在线大片| 久久伊人精品一区二区三区| 久久香蕉av| 国产大片精品免费永久看nba| 午夜av成人| av日韩免费电影| 亚洲精品小区久久久久久| 日韩亚洲视频在线| 在线精品国产| 无码人妻丰满熟妇区96| 免费av网站大全久久| 图片区乱熟图片区亚洲| 成人福利电影精品一区二区在线观看| 亚洲熟妇无码av| 自拍偷拍欧美激情| 日韩激情在线播放| 欧亚一区二区三区| 亚洲av无码乱码国产精品久久| 亚洲精品久久久久久下一站| 二区三区在线| 久久久久成人网| 日韩不卡视频在线观看| 亚洲最大福利视频| 亚洲亚洲免费| 26uuu成人| 性伦欧美刺激片在线观看| 伊人成人222| 91啦中文在线观看| 卡通动漫亚洲综合| 欧美性极品xxxx娇小| 国产农村妇女毛片精品久久| 亚洲精品www| 国产视频在线播放| 日韩免费在线免费观看| 国产精品18| 日韩美女一区| 亚洲黄色影院| 亚洲午夜精品一区| 久久久亚洲高清| 久久久精品国产sm调教网站| 欧美视频一区二区三区在线观看| 国产综合视频在线| 色婷婷**av毛片一区| 成人香蕉视频| 国产精品伊人日日| 一区二区电影| 久久这里只精品| 久久久久久久精| 日韩精品一区二区不卡| 在线不卡a资源高清| 美女做暖暖视频免费在线观看全部网址91| 欧美精品在线第一页| 久久精品超碰| 视频一区二区综合| 国产精品亚洲欧美| 天天躁日日躁狠狠躁av麻豆男男| 中文字幕一区二区三区不卡 | 欧美一区二区三区四区五区六区| 狠狠入ady亚洲精品经典电影| 亚洲精品在线网址| 国产精品卡一卡二| 波多野结衣mp4| 亚洲欧洲中文天堂| 精品众筹模特私拍视频| 92国产精品久久久久首页 | 亚洲三区欧美一区国产二区| 亚洲一区二区三区精品动漫| 日日夜夜精品免费视频| 91网站免费视频| 色综合久久综合网欧美综合网| 黄色aaa大片| 国模叶桐国产精品一区| 136导航精品福利| 狠狠噜天天噜日日噜| 国产精品乡下勾搭老头1| 日本高清一二三区| 欧美日韩在线播放三区四区| 天堂а√在线官网| 国产精品免费久久久| 欧美日韩精品一区二区视频| 国产wwwxx| 国产精品国产三级国产普通话三级 | 性久久久久久久久久久| 午夜视黄欧洲亚洲| 五月婷婷丁香六月| 欧美一级电影久久| 国产精品免费大片| 密臀av一区二区三区| 国产精品久久久久久亚洲毛片| 在线播放精品视频| 超碰91人人草人人干| 伊人久久影院| 成人性生活视频免费看| 99re8在线精品视频免费播放| 久久久久亚洲av成人毛片韩| 国产亚洲欧美aaaa| 成人黄页网站视频| 欧美做受777cos| 成+人+亚洲+综合天堂| 综合网在线观看| 丝袜一区二区三区| 久久在线观看| 毛片在线视频播放| 久久久噜噜噜久久人人看 | 国产精品正在播放| 香蕉视频一区二区| 亚洲人av在线影院| 高清国产一区二区三区四区五区| 97碰在线视频| 久久先锋影音av鲁色资源| 一级特黄aaaaaa大片| 欧美精品18videos性欧美| 深爱激情综合| 亚洲av无日韩毛片久久| 亚洲成人免费观看| 福利视频在线导航| 97视频资源在线观看| 亚洲欧美不卡| 免费在线观看a级片| 欧美精品一区二区三区很污很色的 | 日韩欧美精品| 波多野结衣办公室双飞| 色视频成人在线观看免| 日韩另类在线| 日韩高清国产精品| 国产成人午夜精品5599| 欧美成人一区二区三区四区| 欧美xxxx做受欧美| 久久93精品国产91久久综合| www.成人黄色| 欧美性少妇18aaaa视频| 性xxxfreexxxx性欧美| 欧美一区少妇| 丁香五精品蜜臀久久久久99网站| 91黑人精品一区二区三区| 欧美尺度大的性做爰视频|