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

如何在 GO 中寫出準確的基準測試

開發 后端
編寫基準測試并不簡單,很容易編寫不準確的基準測試,并且基于這些測試得出錯誤的假設。這篇文章的目標是探討導致不準確的四個常見和具體陷阱。

一般來說,我們不應該對性能進行猜測。在編寫優化時,會有許多因素可能起作用,即使我們對結果有很強的看法,測試它們很少是一個壞主意。然而,編寫基準測試并不簡單。很容易編寫不準確的基準測試,并且基于這些測試得出錯誤的假設。這篇文章的目標是探討導致不準確的四個常見和具體陷阱:

  • 不重置或暫停計時器
  • 對微基準測試做出錯誤假設
  • 不注意編譯器優化
  • 被觀察效應所誤導

通用概念

在討論這些陷阱之前,讓我們簡要回顧一下 Go 語言中基準測試的工作原理。基準測試的框架大致如下:

func BenchmarkFoo(b *testing.B) {
    for i := 0; i < b.N; i++ {
        foo()
    }
}

函數名以Benchmark前綴開頭。被測試的函數(foo)在for循環內被調用。b.N代表著可變數量的迭代次數。在運行基準測試時,Go 會嘗試使其匹配所請求的基準測試時間。基準測試時間默認設置為1秒,可以使用-benchtime標志進行更改。b.N從1開始;如果基準測試在1秒內完成,b.N會增加,然后再次運行基準測試,直到b.N大致匹配benchtime為止。

$ go test -bench=.
cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkFoo-4                73          16511228 ns/op

在這里,基準測試大約花費了1秒鐘,foo被執行了73次,平均執行時間為16,511,228納秒。我們可以使用-benchtime來更改基準測試時間:

$ go test -bench=. -benchtime=2s
BenchmarkFoo-4               150          15832169 ns/op

foo 的執行次數大約是上一個基準測試的兩倍。

接下來,讓我們看一些常見的陷阱。

不重置或暫停計時器

在某些情況下,我們需要在基準測試循環之前執行一些操作。這些操作可能需要相當長的時間(例如,生成一個大型數據切片),可能會對基準測試結果產生顯著影響:

func BenchmarkFoo(b *testing.B) {
    expensiveSetup()
    for i := 0; i < b.N; i++ {
        functionUnderTest()
    }
}

在這種情況下,我們可以在進入循環之前使用ResetTimer方法:

func BenchmarkFoo(b *testing.B) {
    expensiveSetup()
    b.ResetTimer() // Reset the benchmark timer
    for i := 0; i < b.N; i++ {
        functionUnderTest()
    }
}

調用ResetTimer會將自測試開始以來的經過時間和內存分配計數器歸零。這樣,一個昂貴的設置步驟可以從測試結果中排除。

如果我們不僅需要在測試中執行一次昂貴的設置步驟,而是需要在每個循環迭代中都執行呢?

func BenchmarkFoo(b *testing.B) {
    for i := 0; i < b.N; i++ {
        expensiveSetup()
        functionUnderTest()
    }
}

我們不能重置計時器,因為那樣會在每次循環迭代期間執行。但是我們可以停止和恢復基準測試計時器,將調用expensiveSetup包裹起來:

func BenchmarkFoo(b *testing.B) {
    for i := 0; i < b.N; i++ {
        b.StopTimer() // Pause the benchmark timer
        expensiveSetup()
        b.StartTimer() // Resume the benchmark timer
        functionUnderTest()
    }
}

在這里,我們暫停基準測試計時器來執行昂貴的設置步驟,然后恢復計時器。

注意: 關于這種方法有一個需要記住的地方:如果被測試的函數執行速度遠遠比設置函數要快,那么基準測試可能會花費太長時間才能完成。原因是它需要比 benchtime 更長的時間才能完成。基準測試時間的計算完全基于 functionUnderTest 的執行時間。所以,如果在每個循環迭代中等待了相當長的時間,基準測試就會比1秒要慢得多。如果我們想保持基準測試,一種可能的緩解方法是減少 benchtime 。

我們必須確保使用計時器方法來保持基準測試的準確性。

對微基準測試做出錯誤假設

微基準測試測量的是微小的計算單元,很容易對它做出錯誤的假設。比如說,我們不確定是應該使用atomic.StoreInt32還是atomic.StoreInt64(假設處理的值始終適合32位)。我們想編寫一個基準測試來比較這兩個函數:

func BenchmarkAtomicStoreInt32(b *testing.B) {
    var v int32
    for i := 0; i < b.N; i++ {
        atomic.StoreInt32(&v, 1)
    }
}

func BenchmarkAtomicStoreInt64(b *testing.B) {
    var v int64
    for i := 0; i < b.N; i++ {
        atomic.StoreInt64(&v, 1)
    }
}

如果我們運行這個基準測試,以下是一些示例輸出:

cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkAtomicStoreInt32
BenchmarkAtomicStoreInt32-4    197107742           5.682 ns/op
BenchmarkAtomicStoreInt64
BenchmarkAtomicStoreInt64-4    213917528           5.134 ns/op

我們很容易認為這個基準測試并且決定使用atomic.StoreInt64,因為它看起來更快。現在,為了進行一次公平的基準測試,我們改變順序,先測試atomic.StoreInt64,然后測試atomic.StoreInt32。以下是一些示例輸出:

BenchmarkAtomicStoreInt64
BenchmarkAtomicStoreInt64-4    224900722           5.434 ns/op
BenchmarkAtomicStoreInt32
BenchmarkAtomicStoreInt32-4    230253900           5.159 ns/op

這次,atomic.StoreInt32有更好的結果。發生了什么事?

在微基準測試中,許多因素都會影響結果,比如在運行基準測試時的機器活動、電源管理、熱管理和一系列指令的更好的緩存對齊。我們必須記住,許多因素,甚至超出我們 Go 項目范圍的因素,都可能會影響結果。

注意: 我們應該確保運行基準測試的機器處于空閑狀態。但是,外部進程可能在后臺運行,這可能會影響基準測試結果。因此,像 perflock 這樣的工具可以限制基準測試可以消耗的CPU。例如,我們可以使用總可用CPU的70%來運行基準測試,將30%分配給操作系統和其他進程,減少機器活動因素對結果的影響。

一個選擇是使用-benchtime選項增加基準測試時間。類似于概率論中的大數定律,如果我們運行大量次數的基準測試,它應該趨向于接近其期望值(假設我們忽略了指令緩存等機制的好處)。

另一個選擇是在經典基準測試工具之上使用外部工具。例如,benchstat工具是golang.org/x代碼庫的一部分,它允許我們計算和比較有關基準測試執行的統計數據。

讓我們使用-count選項運行基準測試10次,并將輸出重定向到一個特定的文件:

$ go test -bench=. -count=10 | tee stats.txt
cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkAtomicStoreInt32-4     234935682                5.124 ns/op
BenchmarkAtomicStoreInt32-4     235307204                5.112 ns/op
// ...
BenchmarkAtomicStoreInt64-4     235548591                5.107 ns/op
BenchmarkAtomicStoreInt64-4     235210292                5.090 ns/op
// ...

然后我們可以在這個文件上運行benchstat:

$ benchstat stats.txt
name                time/op
AtomicStoreInt32-4  5.10ns ± 1%
AtomicStoreInt64-4  5.10ns ± 1%

結果是一樣的:兩個函數的平均完成時間都是5.10納秒。我們還可以看到給定基準測試執行間的百分比變化:±1%。這個指標告訴我們,兩個基準測試都是穩定的,這讓我們對計算出的平均結果更有信心。因此,我們不能得出atomic.StoreInt32比atomic.StoreInt64快或慢的結論,而是可以得出對于我們測試的用途(在特定的Go版本和特定的機器上),它們的執行時間是相似的。

總的來說,我們在進行微基準測試時應該保持謹慎。許多因素都可以對結果產生重大影響,并潛在地導致錯誤的假設。增加基準測試時間或重復基準測試的執行,并使用諸如benchstat之類的工具計算統計數據,可以是限制外部因素并獲得更準確結果的有效方法,從而得出更好的結論。

我們還應該注意,如果另一個系統最終運行該應用程序,要小心使用在特定機器上執行的微基準測試的結果。生產系統的行為可能與我們運行微基準測試的系統大不相同。

不注意編譯器優化

與編寫基準測試相關的另一個常見錯誤是被編譯器優化所欺騙,這也可能導致錯誤的基準測試假設。在這一節中,我們將看看Go語言的14813號問題(https://github.com/golang/go/issues/14813,也被Go項目成員Dave Cheney討論過),涉及到一個人口統計函數(一個計算設置為1的位數的函數):

const m1 = 0x5555555555555555
const m2 = 0x3333333333333333
const m4 = 0x0f0f0f0f0f0f0f0f
const h01 = 0x0101010101010101

func popcnt(x uint64) uint64 {
    x -= (x >> 1) & m1
    x = (x & m2) + ((x >> 2) & m2)
    x = (x + (x >> 4)) & m4
    return (x * h01) >> 56
}

這個函數接受一個uint64并返回一個uint64。為了對這個函數進行基準測試,我們可以編寫以下內容:

func BenchmarkPopcnt1(b *testing.B) {
    for i := 0; i < b.N; i++ {
        popcnt(uint64(i))
    }
}

然而,如果我們執行這個基準測試,結果會非常低得令人驚訝:

cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkPopcnt1-4      1000000000               0.2858 ns/op

一個持續時間為0.28納秒大約是一個時鐘周期,所以這個數字是非常不合理地低。問題在于開發者對編譯器優化不夠謹慎。在這種情況下,被測試的函數非常簡單,可以成為內聯的候選對象:一種優化,用被調用函數的主體替換函數調用,讓我們避免函數調用,這具有很小的開銷。一旦函數被內聯,編譯器注意到調用沒有副作用,并用以下基準測試替換了它:

func BenchmarkPopcnt1(b *testing.B) {
    for i := 0; i < b.N; i++ {
        // Empty
    }
}

現在基準測試是空的,這就是我們得到接近一個時鐘周期結果的原因。為了防止這種情況發生,最佳實踐是遵循以下模式:

  • 在每個循環迭代中,將結果賦值給一個局部變量(在基準測試函數的上下文中為局部變量)。
  • 將最新的結果賦值給一個全局變量。

在我們的情況下,我們編寫以下基準測試:

var global uint64 // Define a global variable

func BenchmarkPopcnt2(b *testing.B) {
    var v uint64 // Define a local variable
    for i := 0; i < b.N; i++ {
        v = popcnt(uint64(i)) // Assign the result to the local variable
    }
    global = v // Assign the result to the global variable
}

global 是一個全局變量,而 v 是一個局部變量,其作用域限定在基準測試函數內部。在每個循環迭代中,我們將 popcnt 的結果賦值給局部變量 v。然后將最新的結果賦值給全局變量 global。

如果我們運行這兩個基準測試,現在結果之間會有顯著的差異:

cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkPopcnt1-4      1000000000               0.2858 ns/op
BenchmarkPopcnt2-4      606402058                1.993 ns/op

BenchmarkPopcnt2 是基準測試的準確版本。它確保我們避免了內聯優化,這種優化可能會人為降低執行時間,甚至去除對被測試函數的調用。依賴BenchmarkPopcnt1的結果可能會導致錯誤的假設。

讓我們記住避免編譯器優化誤導基準測試結果的模式:將被測試函數的結果賦值給一個局部變量,然后將最新的結果賦值給一個全局變量。這種最佳實踐還可以防止我們做出不正確的假設。

被觀察效應的欺騙

在物理學中,觀察者效應是通過觀察行為干擾觀察系統的現象。這種效應也可以在基準測試中看到,并可能導致對結果做出錯誤的假設。讓我們看一個具體的例子,然后嘗試減輕這種影響。

我們想要實現一個接收int64元素矩陣的函數。這個矩陣有固定的512列,我們想要計算前八列的總和,如圖11.2所示。

計算前八列的總和

為了優化的目的,我們還想確定變化列數是否會產生影響,所以我們也實現了一個有513列的第二個函數。實現如下:

func calculateSum512(s [][512]int64) int64 {
    var sum int64
    for i := 0; i < len(s); i++ { // Iterate over each row
        for j := 0; j < 8; j++ { // Iterate over the first eight columns
            sum += s[i][j] // Increment sum
        }
    }
    return sum
}

func calculateSum513(s [][513]int64) int64 {
    // Same implementation as calculateSum512
}

我們遍歷每一行,然后遍歷前八列,并增加一個我們要返回的總和變量。在calculateSum513中的實現保持不變。

我們想對這些函數進行基準測試,以決定在固定行數的情況下哪一個性能最好:

const rows = 1000

var res int64

func BenchmarkCalculateSum512(b *testing.B) {
    var sum int64
    s := createMatrix512(rows) // Create a matrix of 512 columns
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        sum = calculateSum512(s) // Create a matrix of 512 columns
    }
    res = sum
}

func BenchmarkCalculateSum513(b *testing.B) {
    var sum int64
    s := createMatrix513(rows) // Create a matrix of 513 columns
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        sum = calculateSum513(s) // Calculate the sum
    }
    res = sum
}

我們希望只創建一次矩陣,以限制對結果的影響。因此,我們在循環外調用createMatrix512和createMatrix513。我們可能期望結果會類似,因為我們只想遍歷前八列,但事實并非如此(在我的機器上):

cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkCalculateSum512-4        81854             15073 ns/op
BenchmarkCalculateSum513-4       161479              7358 ns/op

第二個擁有513列的基準測試要快大約50%。再次強調,因為我們只遍歷了前八列,這個結果相當令人驚訝。

要理解這種差異,我們需要了解CPU緩存的基礎知識。簡而言之,CPU由不同的緩存組成(通常是L1、L2和L3)。這些緩存降低了從主存儲器訪問數據的平均成本。在某些條件下,CPU可以從主存儲器獲取數據并將其復制到L1。在這種情況下,CPU試圖將calculateSum感興趣的矩陣子集(每行的前八列)放入L1。然而,一個情況下矩陣可以完全放入內存(513列),而另一個情況下不能(512列)。

回到基準測試,主要問題在于我們在兩種情況下都重復使用相同的矩陣。因為該函數重復執行數千次,我們并未測量接收純新矩陣的函數執行情況。相反,我們測量的是一個已經包含在緩存中的矩陣的子集的函數。因此,由于calculateSum513導致的緩存未命中更少,它具有更好的執行時間。

這是觀察效應的一個例子。因為我們一直在觀察重復調用的CPU密集型函數,CPU緩存可能會起作用,并且會對結果產生顯著影響。在這個例子中,為了防止這種效應,我們應該在每次測試中創建一個新的矩陣,而不是重復使用一個:

func BenchmarkCalculateSum512(b *testing.B) {
    var sum int64
    for i := 0; i < b.N; i++ {
        b.StopTimer()
        s := createMatrix512(rows) // Create a new matrix during each loop iteration
        b.StartTimer()
        sum = calculateSum512(s)
    }
    res = sum
}

現在在每次循環迭代中都創建了一個新的矩陣。如果我們再次運行基準測試(并調整benchtime——否則執行時間太長),結果會更接近:

cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkCalculateSum512-4         1116             33547 ns/op
BenchmarkCalculateSum513-4          998             35507 ns/op

不是做出calculateSum513更快的錯誤假設,我們看到當接收新矩陣時,兩個基準測試的結果更接近。

正如我們在本文中看到的那樣,因為我們重復使用了同一個矩陣,CPU緩存對結果產生了顯著影響。為了防止這種情況發生,我們必須在每個循環迭代期間創建一個新的矩陣。總的來說,我們應該記住,在觀察一個被測試函數的情況下,可能會在結果中產生顯著差異,特別是在涉及低級優化的CPU密集型函數的微基準測試中。強制基準測試在每次迭代期間重新創建數據可能是防止這種影響的一種好方法。

結論

  • 使用時間方法來保持基準測試的準確性。
  • 當處理微基準測試時,增加benchtime或使用benchstat等工具可能會有所幫助。
  • 注意微基準測試的結果,如果最終運行應用程序的系統與運行微基準測試的系統不同。
  • 確保被測試函數產生了副作用,以防止編譯器優化讓您對基準測試結果產生誤解。
  • 為了防止觀察者效應,強制基準測試重新創建CPU密集型函數使用的數據。
責任編輯:趙寧寧 來源: 技術的游戲
相關推薦

2022-09-19 11:42:21

Go優化CPU

2021-05-23 15:46:23

React代碼前端

2021-07-09 12:37:31

GoPython編程語言

2016-09-23 16:36:25

LinuxPCPhoronix

2022-03-29 11:48:40

Go泛型測試

2021-01-11 05:20:05

Controller代碼數據層

2013-05-07 09:47:30

測試MySQLMySQL測試

2009-10-10 11:11:40

服務器測試

2022-08-26 08:53:46

單元測試校驗框架

2021-11-08 07:48:48

Go語言對象

2023-06-15 13:01:07

JavaPythonJavaScript

2015-05-19 16:52:13

企業網D1Net

2018-04-19 09:23:07

Linux網速測試命令行工具

2022-07-07 07:22:01

瀏覽器JavaScript工具

2018-11-05 14:53:14

Go函數代碼

2021-11-08 10:58:08

變量依賴圖排序

2021-12-27 08:27:18

RepoGo 代碼

2021-07-02 07:18:19

Goresults通道類型

2018-01-02 15:38:52

WinSAT系統評估

2020-09-16 11:20:03

流計算基準測試
點贊
收藏

51CTO技術棧公眾號

久久91精品国产91久久久| 91精品婷婷国产综合久久性色| 久久99精品久久久久久秒播放器 | 成人激情视频| 91精品国产手机| 久色视频在线播放| 日本精品一区二区三区在线播放| 粉嫩久久99精品久久久久久夜| 日本高清久久天堂| 久操视频免费在线观看| 精品美女久久| 亚洲国产欧美日韩精品| 日韩av卡一卡二| 女人让男人操自己视频在线观看| 国产精品日韩精品欧美在线| 狠狠色噜噜狠狠色综合久| 中文字幕免费观看视频| 亚洲二区免费| 久久这里只有精品99| 自拍偷拍亚洲天堂| 韩国精品福利一区二区三区| 欧美日韩精品一区二区三区蜜桃| 日韩av三级在线| 中文字幕资源网在线观看| 久久久精品国产免大香伊| 国产精品久久久久免费| 国产伦精品一区二区三区免.费| 香蕉视频成人在线观看| 久久久久久网址| 国产精品视频一区二区三| 清纯唯美日韩| 亚洲欧美国产日韩天堂区| 韩国三级hd两男一女| 精品国产亚洲一区二区三区在线 | 日韩精品永久网址| 亚洲欧美激情一区| av无码一区二区三区| avtt综合网| 日韩欧美在线网站| 小明看看成人免费视频| 成人做爰免费视频免费看| 黑人巨大精品欧美一区二区免费| 18黄暴禁片在线观看| 特级毛片在线| 亚洲最新视频在线观看| 少妇高潮大叫好爽喷水| 成人午夜在线影视| 亚洲美女免费在线| www.99riav| 青草在线视频| 午夜久久久久久久久久一区二区| 久久久亚洲国产精品| av剧情在线观看| 欧美日韩精品在线观看| 国产美女在线一区| 多野结衣av一区| 色综合天天综合网天天看片| 成人三级视频在线播放| 日韩高清成人| 欧美电影影音先锋| 黑人巨大猛交丰满少妇| 中文字幕日韩在线| 日韩精品在线电影| 欧美大波大乳巨大乳| 欧美老女人另类| 久久五月天综合| 精品97人妻无码中文永久在线| 国产尤物精品| 欧美一级在线亚洲天堂| 无码人妻丰满熟妇奶水区码| 免费看欧美女人艹b| 91色在线观看| 刘玥91精选国产在线观看| 97超碰欧美中文字幕| 欧美日韩精品免费观看| 亚洲免费视频一区二区三区| 亚洲视频一区二区在线| 亚洲 欧美 综合 另类 中字| 男人的天堂免费在线视频| 欧洲人成人精品| 欧美日韩理论片| 91成人短视频| 国产亚洲人成a一在线v站| 天海翼在线视频| 欧美三区不卡| 国产福利视频一区| 国产日韩欧美视频在线观看| 成人av在线一区二区| 日本高清一区| 欧美hdxxx| 在线亚洲欧美专区二区| 日本xxxx免费| 国产欧美日韩一区二区三区四区| 超碰日本道色综合久久综合| 精品91久久久| 精品一区二区三区日韩| 国语精品中文字幕| 岛国中文字幕在线| 在线观看欧美黄色| 日韩女优在线视频| 婷婷综合网站| 欧美在线精品免播放器视频| 国产精品自偷自拍| 国产亚洲精久久久久久| 成人免费a级片| 黄色精品视频| 日韩精品极品视频| www.av视频| 青草国产精品久久久久久| 不卡的av一区| 嫩草在线视频| 色综合久久中文字幕| 国产乱国产乱老熟300部视频| 欧洲福利电影| 情事1991在线| 色窝窝无码一区二区三区| 亚洲免费在线看| 最新天堂中文在线| 欧美男同视频网| 97视频在线看| 亚洲xxxx天美| 亚洲图片激情小说| 免费涩涩18网站入口| 天天久久夜夜| 97人人模人人爽人人喊中文字| 99国产精品久久久久久久成人| 亚洲国产成人一区二区三区| 毛片一区二区三区四区| 精品av导航| 色综合视频一区中文字幕| 97精品人妻一区二区三区| 国产色一区二区| 日本黄色三级大片| 偷窥自拍亚洲色图精选| 91精品国产自产91精品| 日本精品一二区| 亚洲一二三专区| 欧美午夜精品一区二区| 黑丝一区二区| 国产99视频精品免费视频36| 天堂亚洲精品| 欧美精品一区视频| 欧美三级一区二区三区| 不卡的电视剧免费网站有什么| 免费在线黄网站| 91九色鹿精品国产综合久久香蕉| 欧美精品午夜视频| 亚洲成人一级片| 亚洲图片欧美色图| 性欧美丰满熟妇xxxx性久久久| 亚洲二区在线| 麻豆久久久9性大片| 国产超碰精品| 在线成人中文字幕| 国产精品久久婷婷| 亚洲综合999| 亚洲色偷偷色噜噜狠狠99网| 一本色道精品久久一区二区三区| 久久99精品国产一区二区三区| 欧美aa在线| 亚洲图片欧美午夜| 亚洲怡红院av| 亚洲精品免费视频| 黄色网址在线视频| 日韩精品福利网| 综合操久久久| 成人av综合网| 国产精品91久久久| 国产黄色在线网站| 日韩av网站大全| 中文字幕第315页| 亚洲欧美偷拍另类a∨色屁股| 久久久久国产免费| 久久不射2019中文字幕| 亚洲日本一区二区三区在线不卡| 欧美国产中文高清| 538国产精品一区二区免费视频| 黄色av网站在线免费观看| 3d动漫精品啪啪一区二区竹菊 | 综合激情视频| 久精品国产欧美| 欧美日韩视频免费看| 欧美激情第99页| 久久久久久青草| 欧美一级视频精品观看| 黄色片网站在线免费观看| 中文字幕乱码日本亚洲一区二区| 久久久无码人妻精品无码| 久久黄色影院| 97在线免费视频观看| 日韩理论电影中文字幕| 国产综合香蕉五月婷在线| h片在线观看下载| 社区色欧美激情 | 手机av免费在线观看| 91麻豆精品国产91久久久资源速度 | 国产一区亚洲二区三区| 中文字幕一区二区三区久久网站| 久久精品magnetxturnbtih| 亚洲精品自拍| 国产91网红主播在线观看| 免费污视频在线观看| 在线视频免费一区二区| 五月婷婷伊人网| 日韩视频一区二区在线观看| 国产乱码在线观看| 午夜影院久久久| 印度午夜性春猛xxx交| 久久精品视频网| 在线精品一区二区三区| 国产美女精品人人做人人爽| 五月婷婷激情久久| 免费一级欧美片在线播放| 国产91在线亚洲| 爽成人777777婷婷| 日韩成人在线资源| 亚洲人成网77777色在线播放| 999国产在线| 在线免费观看亚洲| 国产精品第2页| 亚洲午夜天堂| 91精品国产91久久久久久不卡| 青草在线视频| 欧美乱人伦中文字幕在线| 日本电影全部在线观看网站视频 | 成人资源视频网站免费| 日韩欧乱色一区二区三区在线| 国产精品va在线播放我和闺蜜| 欧美gv在线观看| 97精品视频在线| 国精一区二区三区| 久久久久久久亚洲精品| 图片区小说区亚洲| 欧美日韩高清在线观看| 日韩123区| 欧美精品18videos性欧| 国精一区二区三区| 久久青草福利网站| 51漫画成人app入口| 海角国产乱辈乱精品视频| 高h视频在线播放| 久久人人爽人人| 成人免费网站观看| 97国产真实伦对白精彩视频8| а√天堂资源官网在线资源 | 色香欲www7777综合网| 欧日韩在线观看| 午夜无码国产理论在线| 国产精品99久久久久久久久久久久| 欧美成人精品一区二区男人小说| 热草久综合在线| 日本一区二区三区视频在线| 国产精品视频自拍| 九七影院97影院理论片久久 | 国产又粗又长视频| 欧美一级爆毛片| 丰满人妻一区二区三区免费视频| 亚洲成人动漫在线播放| 天堂a√在线| 国产香蕉精品视频一区二区三区 | 国产黄a三级三级三级| 日韩欧美专区在线| 无码国产精品96久久久久| 日韩av有码在线| 成在在线免费视频| 另类图片亚洲另类| 国产乱码在线| 国产精品99免视看9| 亚洲电影二区| 国产精品高清一区二区三区| 偷拍自拍一区| 永久久久久久| 极品av少妇一区二区| 欧美日韩在线视频一区二区三区| 日韩av一区二区在线影视| www.午夜av| 91免费精品国自产拍在线不卡| 免费看91的网站| 夜夜精品视频一区二区| 中文字幕在线欧美| 欧美一级精品大片| 欧洲一区av| 精品中文字幕在线| 二区三区不卡| 91九色露脸| 精品国产美女| 青青青在线观看视频| 美女精品在线观看| 亚洲成人手机在线观看| 久久久精品人体av艺术| www青青草原| 91福利国产精品| 亚洲国产999| 中国china体内裑精亚洲片| 视频在线这里都是精品| 国产成人精品久久二区二区| 亚洲2区在线| 亚洲永久激情精品| 国产欧美一区二区三区国产幕精品| 亚洲一级免费在线观看| 91网站视频在线观看| 欧美成人aaa片一区国产精品| 91电影在线观看| 欧美天堂在线视频| 久久激情视频久久| 巨胸喷奶水www久久久免费动漫| 国产伦精品一区二区三区在线 | www.国产精品一区| 熟女视频一区二区三区| 天堂在线一区二区| 亚洲国产精品无码久久久久高潮| 亚洲视频一区在线观看| 波多野结衣一本一道| 亚洲国产精品yw在线观看| 粗大黑人巨茎大战欧美成人| 国产精品天天狠天天看| 亚洲自拍电影| 免费国产黄色网址| 国产成人日日夜夜| 精品自拍偷拍视频| 91精品国产综合久久久久久 | 久久久久这里只有精品| 国产成年精品| 在线观看欧美激情| 深夜福利一区| 在线观看免费成人| 5252色成人免费视频| 免费成人美女女| 精品一区二区日本| 日韩亚洲国产欧美| 人妻体内射精一区二区三区| 亚洲精品国产高清久久伦理二区| 亚洲天堂一二三| 最新国产精品拍自在线播放| 91精品影视| 欧美亚洲国产免费| 亚洲女人18毛片水真多| 亚洲欧美国产精品va在线观看| 欧美13videosex性极品| 国产在线精品一区| 亚洲激情成人| 黄色性视频网站| 精品福利在线观看| 香蕉视频成人在线| 日本成人黄色片| 国产成人三级| 无码少妇一区二区三区芒果| 久久精品人人做人人爽人人| 无码aⅴ精品一区二区三区| 亚洲欧美中文另类| 日韩av首页| 亚洲欧美国产不卡| 极品少妇一区二区三区精品视频| 天堂av免费在线| 欧美一级高清片| heyzo一区| 蜜桃麻豆www久久国产精品| 久久综合影音| 正在播放国产对白害羞| 欧美精品少妇一区二区三区| 成人影欧美片| 国产九色91| 久久福利毛片| 亚洲人做受高潮| 欧美第一区第二区| 色在线中文字幕| 视频在线观看成人| 国产精品一区在线观看乱码 | 能在线看的av| 国产精品亚洲精品| 欧美午夜电影在线观看| 六十路息与子猛烈交尾| 色噜噜狠狠色综合中国| 五月香视频在线观看| 91免费版网站在线观看| 国产美女诱惑一区二区| 一级黄色毛毛片| 欧美成人一区二区三区片免费| 国内精彩免费自拍视频在线观看网址| 蜜桃臀一区二区三区| 奇米综合一区二区三区精品视频| 国产人妻精品一区二区三区不卡| 亚洲精品在线观看网站| 亚洲mmav| 欧美亚洲色图视频| 国产日韩欧美a| 成人午夜福利视频| 国产精品久在线观看| 黄色亚洲大片免费在线观看| 中国美女乱淫免费看视频| 91精品国产一区二区人妖| 夜鲁夜鲁夜鲁视频在线播放| 致1999电视剧免费观看策驰影院| bt欧美亚洲午夜电影天堂| 中文字幕永久免费视频| 97在线观看视频国产| 91精品国产91久久综合| 国产色视频一区二区三区qq号| 91精品国产综合久久精品| 一区二区三区电影大全|