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

性能調(diào)優(yōu)必備利器之JMH

開發(fā) 后端
本文主要介紹了性能基準(zhǔn)測試工具 JMH,它可以通過一些功能來規(guī)避由 JVM 中的 JIT 或者其他優(yōu)化對(duì)性能測試造成的影響。

if 快還是 switch 快?HashMap 的初始化 size 要不要指定,指定之后性能可以提高多少?各種序列化方法哪個(gè)耗時(shí)更短?

無論出自何種原因需要進(jìn)行性能評(píng)估,量化指標(biāo)總是必要的。

在大部分場合,簡單地回答誰快誰慢是遠(yuǎn)遠(yuǎn)不夠的,如何將程序性能量化呢?

這就需要我們的主角 JMH 登場了!

JMH 簡介

JMH(Java Microbenchmark Harness)是用于代碼微基準(zhǔn)測試的工具套件,主要是基于方法層面的基準(zhǔn)測試,精度可以達(dá)到納秒級(jí)。該工具是由 Oracle 內(nèi)部實(shí)現(xiàn) JIT 的大牛們編寫的,他們應(yīng)該比任何人都了解 JIT 以及 JVM 對(duì)于基準(zhǔn)測試的影響。

當(dāng)你定位到熱點(diǎn)方法,希望進(jìn)一步優(yōu)化方法性能的時(shí)候,就可以使用 JMH 對(duì)優(yōu)化的結(jié)果進(jìn)行量化的分析。

JMH 比較典型的應(yīng)用場景如下:

  1.  想準(zhǔn)確地知道某個(gè)方法需要執(zhí)行多長時(shí)間,以及執(zhí)行時(shí)間和輸入之間的相關(guān)性
  2.  對(duì)比接口不同實(shí)現(xiàn)在給定條件下的吞吐量
  3.  查看多少百分比的請(qǐng)求在多長時(shí)間內(nèi)完成

下面我們以字符串拼接的兩種方法為例子使用 JMH 做基準(zhǔn)測試。

加入依賴

因?yàn)?JMH 是 JDK9 自帶的,如果是 JDK9 之前的版本需要加入如下依賴(目前 JMH 的最新版本為 1.23): 

  1. <dependency>  
  2.     <groupId>org.openjdk.jmh</groupId>  
  3.     <artifactId>jmh-core</artifactId>  
  4.     <version>1.23</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>org.openjdk.jmh</groupId>  
  8.     <artifactId>jmh-generator-annprocess</artifactId>  
  9.     <version>1.23</version>  
  10. </dependency> 

編寫基準(zhǔn)測試

接下來,創(chuàng)建一個(gè) JMH 測試類,用來判斷 + 和 StringBuilder.append() 兩種字符串拼接哪個(gè)耗時(shí)更短,具體代碼如下所示: 

  1. @BenchmarkMode(Mode.AverageTime)  
  2. @Warmup(iterations = 3time = 1 
  3. @Measurement(iterations = 5time = 5 
  4. @Threads(4)  
  5. @Fork(1)  
  6. @State(value = Scope.Benchmark)  
  7. @OutputTimeUnit(TimeUnit.NANOSECONDS)  
  8. public class StringConnectTest {  
  9.     @Param(value = {"10", "50", "100"})  
  10.     private int length;  
  11.     @Benchmark  
  12.     public void testStringAdd(Blackhole blackhole) {  
  13.         String a = "" 
  14.         for (int i = 0; i < length; i++) {  
  15.             a += i;  
  16.         }  
  17.         blackhole.consume(a);  
  18.     }  
  19.     @Benchmark  
  20.     public void testStringBuilderAdd(Blackhole blackhole) {  
  21.         StringBuilder sb = new StringBuilder();  
  22.         for (int i = 0; i < length; i++) {  
  23.             sb.append(i);  
  24.         }  
  25.         blackhole.consume(sb.toString());  
  26.     }  
  27.     public static void main(String[] args) throws RunnerException {  
  28.         Options opt = new OptionsBuilder()  
  29.                 .include(StringConnectTest.class.getSimpleName())  
  30.                 .result("result.json")  
  31.                 .resultFormat(ResultFormatType.JSON).build();  
  32.         new Runner(opt).run();  
  33.     }  

其中需要測試的方法用 @Benchmark 注解標(biāo)識(shí),這些注解的具體含義將在下面介紹。

在 main() 函數(shù)中,首先對(duì)測試用例進(jìn)行配置,使用 Builder 模式配置測試,將配置參數(shù)存入 Options 對(duì)象,并使用 Options 對(duì)象構(gòu)造 Runner 啟動(dòng)測試。

另外大家可以看下官方提供的 jmh 示例 demo:s/src/main/java/org/openjdk/jmh/samples/" _fcksavedurl="http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/">http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/

執(zhí)行基準(zhǔn)測試

準(zhǔn)備工作做好了,接下來,運(yùn)行代碼,等待片刻,測試結(jié)果就出來了,下面對(duì)結(jié)果做下簡單說明: 

  1. # JMH version: 1.23  
  2. # VM version: JDK 1.8.0_201, Java HotSpot(TM) 64-Bit Server VM, 25.201-b09  
  3. # VM invoker: D:\Software\Java\jdk1.8.0_201\jre\bin\java.exe  
  4. # VM options: -javaagent:D:\Software\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=61018:D:\Software\JetBrains\IntelliJ IDEA 2019.1.3\bin -Dfile.encoding=UTF-8 
  5. # Warmup: 3 iterations, 1 s each  
  6. # Measurement: 5 iterations, 5 s each  
  7. # Timeout: 10 min per iteration  
  8. # Threads: 4 threads, will synchronize iterations  
  9. # Benchmark mode: Average time, time/op  
  10. # Benchmark: com.wupx.jmh.StringConnectTest.testStringBuilderAdd  
  11. # Parameters: (length = 100

該部分為測試的基本信息,比如使用的 Java 路徑,預(yù)熱代碼的迭代次數(shù),測量代碼的迭代次數(shù),使用的線程數(shù)量,測試的統(tǒng)計(jì)單位等。 

  1. # Warmup Iteration   1: 1083.569 ±(99.9%) 393.884 ns/op  
  2. # Warmup Iteration   2: 864.685 ±(99.9%) 174.120 ns/op  
  3. # Warmup Iteration   3: 798.310 ±(99.9%) 121.161 ns/op 

該部分為每一次熱身中的性能指標(biāo),預(yù)熱測試不會(huì)作為最終的統(tǒng)計(jì)結(jié)果。預(yù)熱的目的是讓 JVM 對(duì)被測代碼進(jìn)行足夠多的優(yōu)化,比如,在預(yù)熱后,被測代碼應(yīng)該得到了充分的 JIT 編譯和優(yōu)化。 

  1. Iteration   1: 810.667 ±(99.9%) 51.505 ns/op  
  2. Iteration   2: 807.861 ±(99.9%) 13.163 ns/op  
  3. Iteration   3: 851.421 ±(99.9%) 33.564 ns/op  
  4. Iteration   4: 805.675 ±(99.9%) 33.038 ns/op  
  5. Iteration   5: 821.020 ±(99.9%) 66.943 ns/op  
  6. Result "com.wupx.jmh.StringConnectTest.testStringBuilderAdd":  
  7.   819.329 ±(99.9%) 72.698 ns/op [Average]  
  8.   (min, avg, max) = (805.675, 819.329, 851.421), stdev = 18.879  
  9.   CI (99.9%): [746.631, 892.027] (assumes normal distribution)  
  10. Benchmark                               (length)  Mode  Cnt     Score     Error  Units  
  11. StringConnectTest.testStringBuilderAdd       100  avgt    5   819.329 ±  72.698  ns/op 

該部分顯示測量迭代的情況,每一次迭代都顯示了當(dāng)前的執(zhí)行速率,即一個(gè)操作所花費(fèi)的時(shí)間。在進(jìn)行 5 次迭代后,進(jìn)行統(tǒng)計(jì),在本例中,length 為 100 的情況下 testStringBuilderAdd 方法的平均執(zhí)行花費(fèi)時(shí)間為 819.329 ns,誤差為 72.698 ns。

最后的測試結(jié)果如下所示: 

  1. Benchmark                               (length)  Mode  Cnt     Score     Error  Units  
  2. StringConnectTest.testStringAdd               10  avgt    5   161.496 ±  17.097  ns/op  
  3. StringConnectTest.testStringAdd               50  avgt    5  1854.657 ± 227.902  ns/op  
  4. StringConnectTest.testStringAdd              100  avgt    5  6490.062 ± 327.626  ns/op  
  5. StringConnectTest.testStringBuilderAdd        10  avgt    5    68.769 ±   4.460  ns/op  
  6. StringConnectTest.testStringBuilderAdd        50  avgt    5   413.021 ±  30.950  ns/op  
  7. StringConnectTest.testStringBuilderAdd       100  avgt    5   819.329 ±  72.698  ns/op 

結(jié)果表明,在拼接字符次數(shù)越多的情況下,StringBuilder.append() 的性能就更好。

生成 jar 包執(zhí)行

對(duì)于一些小測試,直接用上面的方式寫一個(gè) main 函數(shù)手動(dòng)執(zhí)行就好了。

對(duì)于大型的測試,需要測試的時(shí)間比較久、線程數(shù)比較多,加上測試的服務(wù)器需要,一般要放在 Linux 服務(wù)器里去執(zhí)行。

JMH 官方提供了生成 jar 包的方式來執(zhí)行,我們需要在 maven 里增加一個(gè) plugin,具體配置如下: 

  1. <plugins>  
  2.     <plugin>  
  3.         <groupId>org.apache.maven.plugins</groupId>  
  4.         <artifactId>maven-shade-plugin</artifactId>  
  5.         <version>2.4.1</version>  
  6.         <executions>  
  7.             <execution>  
  8.                 <phase>package</phase>  
  9.                 <goals>  
  10.                     <goal>shade</goal>  
  11.                 </goals>  
  12.                 <configuration>  
  13.                     <finalName>jmh-demo</finalName>  
  14.                     <transformers> 
  15.                          <transformer  
  16.                                 implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">  
  17.                             <mainClass>org.openjdk.jmh.Main</mainClass>  
  18.                         </transformer>  
  19.                     </transformers>  
  20.                 </configuration>  
  21.             </execution>  
  22.         </executions>  
  23.     </plugin>  
  24. </plugins> 

接著執(zhí)行 maven 的命令生成可執(zhí)行 jar 包并執(zhí)行: 

  1. mvn clean install  
  2. java -jar target/jmh-demo.jar StringConnectTest 

JMH 基礎(chǔ)

為了能夠更好地使用 JMH 的各項(xiàng)功能,下面對(duì) JMH 的基本概念進(jìn)行講解:

@BenchmarkMode

用來配置 Mode 選項(xiàng),可用于類或者方法上,這個(gè)注解的 value 是一個(gè)數(shù)組,可以把幾種 Mode 集合在一起執(zhí)行,如:@BenchmarkMode({Mode.SampleTime, Mode.AverageTime}),還可以設(shè)置為 Mode.All,即全部執(zhí)行一遍。

  1.  Throughput:整體吞吐量,每秒執(zhí)行了多少次調(diào)用,單位為 ops/time
  2.  AverageTime:用的平均時(shí)間,每次操作的平均時(shí)間,單位為 time/op
  3.  SampleTime:隨機(jī)取樣,最后輸出取樣結(jié)果的分布
  4.  SingleShotTime:只運(yùn)行一次,往往同時(shí)把 Warmup 次數(shù)設(shè)為 0,用于測試?yán)鋯?dòng)時(shí)的性能
  5.  All:上面的所有模式都執(zhí)行一次

@State

通過 State 可以指定一個(gè)對(duì)象的作用范圍,JMH 根據(jù) scope 來進(jìn)行實(shí)例化和共享操作。@State 可以被繼承使用,如果父類定義了該注解,子類則無需定義。由于 JMH 允許多線程同時(shí)執(zhí)行測試,不同的選項(xiàng)含義如下:

  1.  Scope.Benchmark:所有測試線程共享一個(gè)實(shí)例,測試有狀態(tài)實(shí)例在多線程共享下的性能
  2.  Scope.Group:同一個(gè)線程在同一個(gè) group 里共享實(shí)例
  3.  Scope.Thread:默認(rèn)的 State,每個(gè)測試線程分配一個(gè)實(shí)例

@OutputTimeUnit

為統(tǒng)計(jì)結(jié)果的時(shí)間單位,可用于類或者方法注解

@Warmup

預(yù)熱所需要配置的一些基本測試參數(shù),可用于類或者方法上。一般前幾次進(jìn)行程序測試的時(shí)候都會(huì)比較慢,所以要讓程序進(jìn)行幾輪預(yù)熱,保證測試的準(zhǔn)確性。參數(shù)如下所示:

  1.  iterations:預(yù)熱的次數(shù)
  2.  time:每次預(yù)熱的時(shí)間
  3.  timeUnit:時(shí)間的單位,默認(rèn)秒
  4.  batchSize:批處理大小,每次操作調(diào)用幾次方法

為什么需要預(yù)熱?

因?yàn)?JVM 的 JIT 機(jī)制的存在,如果某個(gè)函數(shù)被調(diào)用多次之后,JVM 會(huì)嘗試將其編譯為機(jī)器碼,從而提高執(zhí)行速度,所以為了讓 benchmark 的結(jié)果更加接近真實(shí)情況就需要進(jìn)行預(yù)熱。

@Measurement

實(shí)際調(diào)用方法所需要配置的一些基本測試參數(shù),可用于類或者方法上,參數(shù)和 @Warmup 相同。

@Threads

每個(gè)進(jìn)程中的測試線程,可用于類或者方法上。

@Fork

進(jìn)行 fork 的次數(shù),可用于類或者方法上。如果 fork 數(shù)是 2 的話,則 JMH 會(huì) fork 出兩個(gè)進(jìn)程來進(jìn)行測試。

@Param

指定某項(xiàng)參數(shù)的多種情況,特別適合用來測試一個(gè)函數(shù)在不同的參數(shù)輸入的情況下的性能,只能作用在字段上,使用該注解必須定義 @State 注解。

在介紹完常用的注解后,讓我們來看下 JMH 有哪些陷阱。

JMH 陷阱

在使用 JMH 的過程中,一定要避免一些陷阱。

比如 JIT 優(yōu)化中的死碼消除,比如以下代碼: 

  1. @Benchmark  
  2. public void testStringAdd(Blackhole blackhole) {  
  3.     String a = "" 
  4.     for (int i = 0; i < length; i++) {  
  5.         a += i;  
  6.     }  

JVM 可能會(huì)認(rèn)為變量 a 從來沒有使用過,從而進(jìn)行優(yōu)化把整個(gè)方法內(nèi)部代碼移除掉,這就會(huì)影響測試結(jié)果。

JMH 提供了兩種方式避免這種問題,一種是將這個(gè)變量作為方法返回值 return a,一種是通過 Blackhole 的 consume 來避免 JIT 的優(yōu)化消除。

其他陷阱還有常量折疊與常量傳播、永遠(yuǎn)不要在測試中寫循環(huán)、使用 Fork 隔離多個(gè)測試方法、方法內(nèi)聯(lián)、偽共享與緩存行、分支預(yù)測、多線程測試等,感興趣的可以閱讀 https://github.com/lexburner/JMH-samples 了解全部的陷阱。

JMH 插件

大家還可以通過 IDEA 安裝 JMH 插件使 JMH 更容易實(shí)現(xiàn)基準(zhǔn)測試,在 IDEA 中點(diǎn)擊 File->Settings...->Plugins,然后搜索 jmh,選擇安裝 JMH plugin:

JMH plugin

這個(gè)插件可以讓我們能夠以 JUnit 相同的方式使用 JMH,主要功能如下:

  1.  自動(dòng)生成帶有 @Benchmark 的方法
  2.  像 JUnit 一樣,運(yùn)行單獨(dú)的 Benchmark 方法
  3.  運(yùn)行類中所有的 Benchmark 方法

比如可以通過右鍵點(diǎn)擊 Generate...,選擇操作 Generate JMH benchmark 就可以生成一個(gè)帶有 @Benchmark 的方法。

還有將光標(biāo)移動(dòng)到方法聲明并調(diào)用 Run 操作就運(yùn)行一個(gè)單獨(dú)的 Benchmark 方法。

將光標(biāo)移到類名所在行,右鍵點(diǎn)擊 Run 運(yùn)行,該類下的所有被 @Benchmark 注解的方法都會(huì)被執(zhí)行。

JMH 可視化

除此以外,如果你想將測試結(jié)果以圖表的形式可視化,可以試下這些網(wǎng)站:

  •  JMH Visual Chart:http://deepoove.com/jmh-visual-chart/
  •  JMH Visualizer:https://jmh.morethan.io/

比如將上面測試?yán)咏Y(jié)果的 json 文件導(dǎo)入,就可以實(shí)現(xiàn)可視化:

總結(jié)

本文主要介紹了性能基準(zhǔn)測試工具 JMH,它可以通過一些功能來規(guī)避由 JVM 中的 JIT 或者其他優(yōu)化對(duì)性能測試造成的影響。

只需要將待測的業(yè)務(wù)邏輯用 @Benchmark 注解標(biāo)識(shí),就可以讓 JMH 的注解處理器自動(dòng)生成真正的性能測試代碼,以及相應(yīng)的性能測試配置文件。 

 

責(zé)任編輯:龐桂玉 來源: Java編程
相關(guān)推薦

2017-07-21 08:55:13

TomcatJVM容器

2013-03-20 17:18:07

Linux系統(tǒng)性能調(diào)優(yōu)

2011-03-18 11:13:07

LAMP度量性能

2011-03-21 09:35:38

LAMP調(diào)優(yōu)網(wǎng)絡(luò)文件

2012-06-20 11:05:47

性能調(diào)優(yōu)攻略

2021-07-15 08:00:47

系統(tǒng)性能調(diào)優(yōu)cpunuma架構(gòu)

2023-11-28 08:43:48

2021-03-04 08:39:21

SparkRDD調(diào)優(yōu)

2020-01-14 09:13:48

Tomcat調(diào)優(yōu)配置

2011-03-21 09:17:35

LAMP調(diào)優(yōu)磁盤

2011-03-10 14:40:54

LAMPMysql

2011-05-20 15:02:01

Oracle性能調(diào)優(yōu)

2011-11-14 10:28:23

2020-11-30 11:40:35

NginxLinux性能調(diào)優(yōu)

2011-02-15 09:31:56

ASP.NET

2011-03-18 11:21:48

2012-06-21 09:43:45

2013-02-28 10:15:14

Ubuntu性能調(diào)優(yōu)故障排查

2024-12-04 15:49:29

2021-11-07 23:49:19

SQL數(shù)據(jù)庫工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

韩国成人二区| 国产精品羞羞答答在线| 国产精品自在线拍| 午夜精品福利在线| 免费毛片一区二区三区久久久| 亚洲 欧美 日韩 在线| 99精品网站| 亚洲第一区在线| 国产精品亚洲二区在线观看| 快射av在线播放一区| 成人精品国产福利| 国产精品久久久久久久久粉嫩av| 希岛爱理中文字幕| 思热99re视热频这里只精品| 欧美日韩一区中文字幕| 999在线观看视频| 爱爱爱免费视频在线观看| 风间由美一区二区三区在线观看| 日本欧美中文字幕| 校园春色 亚洲| 国产一区二区三区探花 | 日韩视频免费观看高清| 成人在线免费小视频| 精品粉嫩aⅴ一区二区三区四区| 黄色片在线免费| av在线网页| 中文字幕在线不卡视频| 欧美激情第一页在线观看| 国产三级漂亮女教师| 久久五月激情| 久久久亚洲国产| 黄色一级大片在线免费观看| 国产成人高清| 日韩精品日韩在线观看| 国产sm在线观看| 亚州精品国产| 欧洲精品在线观看| 国产96在线 | 亚洲| a级片国产精品自在拍在线播放| 久久婷婷久久一区二区三区| 好吊色欧美一区二区三区四区 | 欧美mv日韩mv国产网站| 不卡中文字幕在线观看| 成人免费黄色| 在线精品视频免费观看| 男女高潮又爽又黄又无遮挡| 蜜臀av在线| 亚洲在线视频一区| 日韩一级特黄毛片| 黄网页在线观看| 国产精品国产三级国产a | 自拍欧美日韩| 久久久国产一区二区三区| 亚洲黄色网址大全| 精品一区二区三区在线| 国产亚洲精品成人av久久ww| 一出一进一爽一粗一大视频| 国产精品三p一区二区| 精品噜噜噜噜久久久久久久久试看| 色婷婷一区二区三区在线观看| 欧美激情福利| 制服丝袜一区二区三区| 亚洲欧美日本一区二区| 曰本一区二区| 日韩一区二区三区三四区视频在线观看 | 麻豆导航在线观看| 91麻豆成人久久精品二区三区| 狠狠色综合欧美激情| 亚洲人成色777777老人头| 91网站在线观看视频| 欧美日韩大片一区二区三区| 巨骚激情综合| 国产精品理论片在线观看| 一区二区不卡视频| 亚洲男同gay网站| 亚洲永久免费视频| 日韩少妇内射免费播放18禁裸乳| 亚洲十八**毛片| 一本久久综合亚洲鲁鲁五月天| 日韩在线第三页| 中文字幕日韩亚洲| 精品国偷自产国产一区| 人妻丰满熟妇av无码久久洗澡| 久久综合色占| 精品国产依人香蕉在线精品| 久久久99精品| 久久国产精品久久久久久电车| 日本欧美一二三区| 国产精品一区二区黑人巨大| 成人午夜免费视频| 欧洲精品在线一区| 乱人伦中文视频在线| 亚洲国产精品尤物yw在线观看| 免费在线激情视频| 久久久久久久性潮| 亚洲第一精品久久忘忧草社区| 蜜臀av一区二区三区有限公司| 波多野结衣一区| 欧美激情videoshd| 亚洲国产精品无码久久久| 韩国精品在线观看| 欧美日韩大片一区二区三区 | 国产精品色一区二区三区| 免费在线观看污污视频| 2021中文字幕在线| 欧美日韩三级视频| 免费成人蒂法网站| 天天天综合网| 奇米影视亚洲狠狠色| av免费在线不卡| 久久久久久久久97黄色工厂| 老汉色影院首页| 日韩成人动漫| 亚洲成年人影院在线| 最新日韩免费视频| 久久成人在线| 成人在线看片| 成人免费视频| 欧美午夜久久久| 亚洲妇女无套内射精| av亚洲免费| 欧美一区二区视频97| 99久久精品国产一区二区成人| 国产偷v国产偷v亚洲高清| 欧美人与动牲交xxxxbbbb| 欧洲精品一区二区三区| 日韩精品小视频| 五月婷婷一区二区| 久久精品国产色蜜蜜麻豆| 免费国产一区二区| av在线理伦电影| 精品少妇一区二区三区日产乱码| 四虎影视一区二区| 日日夜夜一区二区| 欧美日韩国产不卡在线看| 99在线视频影院| 精品久久一区二区三区| 成人免费视频网站入口::| 免费高清在线视频一区·| 欧洲精品一区色| 伊人久久精品一区二区三区| 亚洲福利影片在线| 国产精品第72页| 成人午夜碰碰视频| 久久艹国产精品| 国产伦精品一区二区三区免费优势| 美女久久久久久久久久久| 国产日韩免费视频| 亚洲三级在线观看| 一级做a爱视频| 51精产品一区一区三区| 成人免费直播live| 黄色在线论坛| 日韩一二三四区| 玖玖爱免费视频| 成人一级视频在线观看| www.日本在线视频| 黄色免费大全亚洲| 国产69精品久久久久久| 日本一二三区在线视频| 色婷婷久久久久swag精品| 人妻av无码一区二区三区| 国产精品日韩精品欧美精品| 欧美日韩高清在线一区| 成人福利片在线| 精品国偷自产在线| 精品人妻午夜一区二区三区四区 | 日韩乱码一区二区| 99re热这里只有精品免费视频 | 91麻豆精品成人一区二区| 国产呦精品一区二区三区网站| 日本高清视频免费在线观看| 日韩成人视屏| 91精品国产高清久久久久久91| 日漫免费在线观看网站| 欧美亚洲国产怡红院影院| 国产精品一区二区亚洲| 国产精品一区二区久激情瑜伽| 男人天堂av片| 国产成人av| 亚洲精品欧美极品| 韩国精品一区| 一区二区日韩精品| 99热这里只有精| 精品福利在线看| 永久免费毛片在线观看| 国产自产v一区二区三区c| 欧日韩免费视频| 成人高清电影网站| 成人午夜电影在线播放| 在线观看爽视频| 精品国产欧美一区二区五十路 | 国产成人在线视频免费播放| av免费观看网| 91精品国产视频| 久久国产精品一区二区三区四区 | 成人情视频高清免费观看电影| 在线成人av观看| 久久久精品免费视频| 五月天久久久久久| 在线播放中文一区| 久久国产视频精品| 亚洲欧美国产三级| 久操视频免费看| 国产精品18久久久久久久久久久久| 国产精品秘入口18禁麻豆免会员| 日韩成人影院| 久久99精品久久久久子伦| 亚洲日本中文| 热99在线视频| 成人影院在线播放| 色阁综合伊人av| 天堂在线中文| 日韩欧美中文字幕精品| 亚洲精品国产无码| 偷窥少妇高潮呻吟av久久免费| 情侣偷拍对白清晰饥渴难耐| 96av麻豆蜜桃一区二区| 午夜天堂在线视频| 日韩成人精品在线观看| 无码中文字幕色专区| 一区二区三区四区电影| 先锋影音亚洲资源| 岳的好大精品一区二区三区| 成人自拍网站| 国产区一区二| 国产一区红桃视频| 日韩欧美少妇| 奇米四色中文综合久久| 91黄页在线观看| 九九九久久国产免费| 蜜桃视频在线观看www社区| 国产亚洲精品成人av久久ww| 色吊丝在线永久观看最新版本| 精品国产污网站| 国产三级自拍视频| 欧美日韩精品综合在线| 欧美日韩综合一区二区三区| 午夜精品久久久久久久久久久| 97成人资源站| 亚洲日本在线看| 免费成年人视频在线观看| 国产精品你懂的| 国产一二三av| 中文字幕一区二区不卡| 神马久久精品综合| 亚洲欧美自拍偷拍色图| www.xx日本| 中文字幕一区不卡| 久久嫩草捆绑紧缚| 日韩理论在线观看| 欧美日韩午夜视频| 亚洲人成精品久久久久久| 久久久久久久麻豆| 亚洲激情av在线| 久久综合亚洲色hezyo国产| 亚洲一区二区精品3399| 久久久久久久久久久久国产| 亚洲午夜电影网| 久久不卡免费视频| 日韩欧美高清视频| 黄色av网站免费| 欧美日韩亚洲综合一区| 91丨九色丨蝌蚪丨对白| 欧美一区二区三区电影| 韩国av在线免费观看| 亚洲黄色www| 日韩电影免费| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 国产黑人绿帽在线第一区| 国内欧美日韩| 亚洲一区二区三区视频| 嗯用力啊快一点好舒服小柔久久| 精品久久精品久久| 教室别恋欧美无删减版| 亚洲一区二区在线观| 欧美三区不卡| 久久这里只有精品视频网| 99热一区二区| 国产精品996| 无套内谢大学处破女www小说| 国产日本欧洲亚洲| 男人与禽猛交狂配| 亚洲成av人片观看| 波多野结衣小视频| 欧美一级日韩免费不卡| 视频二区在线观看| 在线精品播放av| 青草在线视频| 国产成人短视频| 欧美高清一级片| 欧美成ee人免费视频| 欧美mv日韩| 少妇高潮喷水在线观看| 青青青伊人色综合久久| 美女又黄又免费的视频| 久久久久久亚洲综合| 在线观看美女av| 欧美视频在线观看免费网址| 91麻豆国产视频| 日韩成人激情在线| 成人在线播放| 国产成人免费91av在线| 136福利精品导航| 午夜精品短视频| 亚洲精品麻豆| 欧美体内she精高潮| 国产亚洲欧美日韩在线一区| 久久久久久久久艹| 欧美久久久一区| 三级视频在线| 欧美美女15p| 久久久加勒比| 日本高清不卡一区二区三| 欧美视频亚洲视频| 亚洲视频第二页| 久久久久久久久伊人| 欧美专区一二三 | 亚洲人成伊人成综合图片| 免费国产成人看片在线| 日产国产高清一区二区三区| 成人在线电影网站| 亚洲欧美日韩成人高清在线一区| 亚洲成人av影片| 亚洲精品www| 青青草原av在线| 亚洲一区精品电影| 欧洲杯半决赛直播| 欧在线一二三四区| av电影一区二区| 久久久久久欧美精品se一二三四| 欧美日韩国产成人在线91| 国产天堂在线| 国产精品777| 亚洲人亚洲人色久| 国产精品国产亚洲精品看不卡| 国产精品99久久久久久宅男| 欧美视频一区二区在线| 欧洲av一区二区嗯嗯嗯啊| 欧美色图另类| 日本伊人精品一区二区三区介绍| 国产三区四区在线观看| 亚洲综合丝袜美腿| 99久久精品国产一区色| 日韩小视频在线| 色天使综合视频| 日韩高清dvd| 奇米色一区二区| 久久久精品成人| 欧美日韩一级二级三级| av在线电影网| 国产精品女视频| 欧美激情777| 网站在线你懂的| 亚洲另类一区二区| www.超碰在线.com| 欧美黑人xxxx| 国产91精品入| 奇米精品一区二区三区| 91在线你懂得| 黄色av网站免费观看| 亚洲天堂男人的天堂| 日本精品网站| 亚洲欧洲日韩精品| 久久99国产精品免费| 欧美大片xxxx| 日韩精品一区二区三区在线| eeuss鲁一区二区三区| 欧美日韩国产免费一区二区三区| 日韩一区精品字幕| 欧美视频一区二区在线| 欧美tickling网站挠脚心| 国产直播在线| 色女人综合av| 国产麻豆精品95视频| 日韩伦人妻无码| 国产一区二区三区在线播放免费观看 | 牛牛精品成人免费视频| 国产福利视频在线播放| 欧美国产日韩亚洲一区| 国产伦一区二区| 国语自产精品视频在线看| 国产精品中文字幕亚洲欧美| 五月花丁香婷婷| 午夜伊人狠狠久久| 成人p站proumb入口| 91精品国产91久久久久青草| av不卡在线看| 亚洲一级理论片| 亚洲第一级黄色片| 精品福利在线| 欧洲精品一区二区三区久久| 国产喂奶挤奶一区二区三区| 国产三级自拍视频| 日韩av电影免费观看高清| 亚洲区综合中文字幕日日| 亚洲黄色在线网站| 欧美一级高清片| 日韩电影av| 日韩精品在线中文字幕|