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

Go 泛型基準(zhǔn)測試:性能更差還是更好?

開發(fā) 前端
在泛型基準(zhǔn)測試中,基準(zhǔn)測試將測試所有用例中int和float32的減法函數(shù),我添加了第三個選項,推斷數(shù)據(jù)類型。我還想確定如果我們讓泛型函數(shù)將數(shù)據(jù)類型推斷為int會有怎樣的表現(xiàn)。

Go1.18 已經(jīng)發(fā)布了,泛型終于正式進入了 Go 語言。那泛型將如何影響性能?讓我們通過對幾個用例進行基準(zhǔn)測試來弄清楚。

關(guān)于 Go1.18 新特性的文章有很多,討論也不少。其中一個討論是我想寫的一個主題,即泛型對性能有什么影響?許多讀者擔(dān)心泛型會降低性能,但我的觀點是泛型會提高性能。我的觀點背后的原因是泛型將允許我們在運行時跳過類型轉(zhuǎn)換、斷言和反射,而是依賴編譯器在編譯時決定這個問題。

在我關(guān)于學(xué)習(xí)泛型[1]的文章中,我解釋了泛型的用法,兩個主要好處是減少了基于數(shù)據(jù)類型的重復(fù)函數(shù)并避免了interface{}. 這些是我們將在本文中進行基準(zhǔn)測試的用例,以發(fā)現(xiàn)更改的性能。

說明下:我不是基準(zhǔn)測試專家。我只是一個基準(zhǔn)測試菜鳥。在我看來,基準(zhǔn)測試非常困難。

為了做出公平的基準(zhǔn)測試,我們將為每個用例設(shè)置一個測試用例。這將意味著我們將:

  • 使用重復(fù)函數(shù)進行基準(zhǔn)測試
  • 使用泛型進行基準(zhǔn)測試
  • 使用使用 interface{} 進行基準(zhǔn)測試

準(zhǔn)備函數(shù)進行基準(zhǔn)測

試我們將重用學(xué)習(xí)泛型[2]中的一些代碼,在其中,我們有一個Subtract函數(shù)可以減去三種Subtractable數(shù)據(jù)類型之間的值。

我們將要確定哪些 Subtract 方法性能最好。可以在 Playground[3] 嘗試一下。

package functions

// Subtract will subtract the second value from the first
func SubtractInt(a, b int) int {
return a - b
}

// Subtract64 will subtract the second value from the first
func SubtractInt64(a, b int) int {
return a - b
}

// SubtractFloat32 will subtract the second value from the first
func SubtractFloat32(a, b float32) float32 {
return a - b
}
// SubtractTypeSwitch is used to subtract using interfaces
func SubtractTypeSwitch(a, b interface{}) interface{} {
switch a.(type) {
case int:
return a.(int) - b.(int)
case int64:
return a.(int64) - b.(int64)
case float32:
return a.(float32) - b.(float32)
default:
return nil
}
}

// Subtract will subtract the second value from the first
func Subtract[V int64 | int | float32](a, b V "V int64 | int | float32") V {
return a - b
}

在那里,我們將開始對功能進行基準(zhǔn)測試。它們應(yīng)該相當(dāng)容易理解,并且我們涵蓋了減法、基于數(shù)據(jù)類型、類型切換和泛型的可能解決方案。

準(zhǔn)備基準(zhǔn)測試

創(chuàng)建一個常規(guī)的測試文件,我們可以在其中存儲基準(zhǔn),如果你熟悉 Go 中的基準(zhǔn),你可以閱讀這里的教程[4]。

在基準(zhǔn)測試的頂部,我將生成兩個切片,一個隨機整數(shù)切片,一個隨機 float32 切片。這些隨機切片將用作減法方法的輸入?yún)?shù)。

然后我們創(chuàng)建一個b.Run函數(shù),它會一次觸發(fā)一個函數(shù),次數(shù)與我們設(shè)置為基準(zhǔn)測試器的次數(shù)一樣多,使用-benchtime標(biāo)志運行。對于這個基準(zhǔn)測試,我將強制基準(zhǔn)測試器運行每個函數(shù) 1000000000 次。如果你未指定運行函數(shù)的次數(shù),則基準(zhǔn)測試程序會在特定時間內(nèi)盡可能多次地運行該函數(shù)。這將以它們沒有運行相同數(shù)量的操作而告終,我希望它們這樣做。

這就是我最終的基準(zhǔn)測試的樣子。

用于執(zhí)行基準(zhǔn)測試以確定泛型性能影響的測試文件。

package functions

import (
"math/rand"
"testing"
"time"
)
// Benchmark_Subtract is used to determine the most performant solution to subtraction
func Benchmark_Subtract(b *testing.B) {
// Create a slice of random numbers based on the number of iterations set
// to test the performance of the function
// Default iterations for me is 1000000000
// b.N is always 1 so we can use that to set the number of iterations
numbers := make([]int, 1000000001)
floatNumbers := make([]float32, 1000000001)
// Create a random seed

seed := rand.NewSource(time.Now().UnixNano())
// Give the seed to the random package
randomizer := rand.New(seed)
for i := 0; i < b.N; i++ {
// randomize numbers between 0-100
numbers[i] = randomizer.Intn(100)
floatNumbers[i] = float32(randomizer.Intn(100))
}
// run a benchmark for regular Ints
b.Run("SubtractInt", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SubtractInt(numbers[i], numbers[i+1])
}
})
// run a benchmark for regular Floats
b.Run("SubtractFloat", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SubtractFloat32(floatNumbers[i], floatNumbers[i+1])
}
})
// run a benchmark for TypeSwitched Ints
b.Run("Type_Subtraction_int", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SubtractTypeSwitch(numbers[i], numbers[i+1])
}
})
// run a benchmark for TypeSwitched Floats
b.Run("Type_Subtraction_float", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SubtractTypeSwitch(floatNumbers[i], floatNumbers[i+1])
}
})

// run a benchmark for Generic Ints
b.Run("Generic_Subtraction_int", func(b *testing.B) {
for i := 0; i < b.N; i++ {
Subtract[int](numbers[i], numbers[i+1] "int")
}
})
// run a benchmark for Generic Floats
b.Run("Generic_Subtraction_float", func(b *testing.B) {
for i := 0; i < b.N; i++ {
Subtract[float32](floatNumbers[i], floatNumbers[i+1] "float32")
}
})
// run a benchmark where generic type is infered
b.Run("Generic_Inferred_int", func(b *testing.B) {
for i := 0; i < b.N; i++ {
Subtract(numbers[i], numbers[i+1])
}
})
}

在泛型基準(zhǔn)測試中,基準(zhǔn)測試將測試所有用例中int和float32的減法函數(shù),我添加了第三個選項,推斷數(shù)據(jù)類型。我還想確定如果我們讓泛型函數(shù)將數(shù)據(jù)類型推斷為int會有怎樣的表現(xiàn)。

要運行基準(zhǔn)測試,請使用以下命令。請注意,該-count 5參數(shù)用于將每個基準(zhǔn)測試運行 5 次。這是因為如果你運行每個基準(zhǔn)測試一次,你可能會得到不公平的結(jié)果。

go test -v -bench=Benchmark -benchtime=1000000000x -count 5

分析結(jié)果

基準(zhǔn)測試將與正在運行的函數(shù)的名稱一起輸出,我們可以使用它來識別不同的函數(shù)。第二個值是運行的操作數(shù),在我們的例子中,我們將其設(shè)置為固定數(shù)字,因此所有行都應(yīng)該顯示相同。

第三個輸出很有趣,它是每次操作的納秒數(shù) (ns/op)。這是顯示函數(shù)平均速度的指標(biāo)。

Go 測試工具的基準(zhǔn)測試結(jié)果。

goos: windows
goarch: amd64
pkg: programmingpercy/benchgeneric
cpu: Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz
Benchmark_Subtract
Benchmark_Subtract/SubtractInt
Benchmark_Subtract/SubtractInt-4 1000000000 0.9002 ns/op
Benchmark_Subtract/SubtractInt-4 1000000000 0.8904 ns/op
Benchmark_Subtract/SubtractInt-4 1000000000 0.8277 ns/op
Benchmark_Subtract/SubtractInt-4 1000000000 0.8290 ns/op
Benchmark_Subtract/SubtractInt-4 1000000000 0.8266 ns/op
Benchmark_Subtract/SubtractFloat
Benchmark_Subtract/SubtractFloat-4 1000000000 0.8591 ns/op
Benchmark_Subtract/SubtractFloat-4 1000000000 0.8033 ns/op
Benchmark_Subtract/SubtractFloat-4 1000000000 0.8108 ns/op
Benchmark_Subtract/SubtractFloat-4 1000000000 0.8168 ns/op
Benchmark_Subtract/SubtractFloat-4 1000000000 0.8040 ns/op
Benchmark_Subtract/Type_Subtraction_int
Benchmark_Subtract/Type_Subtraction_int-4 1000000000 1.597 ns/op
Benchmark_Subtract/Type_Subtraction_int-4 1000000000 1.711 ns/op
Benchmark_Subtract/Type_Subtraction_int-4 1000000000 1.607 ns/op
Benchmark_Subtract/Type_Subtraction_int-4 1000000000 1.570 ns/op
Benchmark_Subtract/Type_Subtraction_int-4 1000000000 1.588 ns/op
Benchmark_Subtract/Type_Subtraction_float
Benchmark_Subtract/Type_Subtraction_float-4 1000000000 1.320 ns/op
Benchmark_Subtract/Type_Subtraction_float-4 1000000000 1.311 ns/op
Benchmark_Subtract/Type_Subtraction_float-4 1000000000 1.323 ns/op
Benchmark_Subtract/Type_Subtraction_float-4 1000000000 1.424 ns/op
Benchmark_Subtract/Type_Subtraction_float-4 1000000000 1.321 ns/op
Benchmark_Subtract/Generic_Subtraction_int
Benchmark_Subtract/Generic_Subtraction_int-4 1000000000 0.8251 ns/op
Benchmark_Subtract/Generic_Subtraction_int-4 1000000000 0.8288 ns/op
Benchmark_Subtract/Generic_Subtraction_int-4 1000000000 0.8420 ns/op
Benchmark_Subtract/Generic_Subtraction_int-4 1000000000 0.8377 ns/op
Benchmark_Subtract/Generic_Subtraction_int-4 1000000000 0.8357 ns/op
Benchmark_Subtract/Generic_Subtraction_float
Benchmark_Subtract/Generic_Subtraction_float-4 1000000000 0.7952 ns/op
Benchmark_Subtract/Generic_Subtraction_float-4 1000000000 0.7987 ns/op
Benchmark_Subtract/Generic_Subtraction_float-4 1000000000 0.7877 ns/op
Benchmark_Subtract/Generic_Subtraction_float-4 1000000000 0.8037 ns/op
Benchmark_Subtract/Generic_Subtraction_float-4 1000000000 0.8283 ns/op
Benchmark_Subtract/Generic_Inferred_int
Benchmark_Subtract/Generic_Inferred_int-4 1000000000 0.8297 ns/op
Benchmark_Subtract/Generic_Inferred_int-4 1000000000 0.8283 ns/op
Benchmark_Subtract/Generic_Inferred_int-4 1000000000 0.8319 ns/op
Benchmark_Subtract/Generic_Inferred_int-4 1000000000 0.8366 ns/op
Benchmark_Subtract/Generic_Inferred_int-4 1000000000 0.8623 ns/op
PASS
ok programmingpercy/benchgeneric 37.114s

從結(jié)果中,我們可以確定類型斷言函數(shù)要慢得多。它*慢了大約 50-90%*。在這個測試用例中,這似乎很荒謬,因為我們談?wù)摰氖前爰{秒。

泛型函數(shù)的執(zhí)行與特定于數(shù)據(jù)類型的函數(shù)大致相同,但速度略有提高。速度的這種小幅提高可能是由于我計算機上運行的其他軟件。以我的心態(tài),我認為編譯器完成其工作后,泛型函數(shù)調(diào)用應(yīng)該與常規(guī)函數(shù)調(diào)用相同。

我們可以在結(jié)果中看到的另一個要點是int減法比float32減法更耗時。常規(guī)int減法的平均速度為 0,85478 ns/op,常規(guī)float32減法的平均速度為0,8188 ns/op。這意味著在我的基準(zhǔn)測試中,float32減法大約快 5% 。

因此,該基準(zhǔn)的關(guān)鍵要點是:

  • 根據(jù)我的觀點,類型斷言/類型轉(zhuǎn)換解決方案最慢
  • 泛型和常規(guī)數(shù)據(jù)類型函數(shù)的性能相同
  • Float32減法比int快

以真實場景為基準(zhǔn)

讓我們比較一個真實的場景。在用例中,我們有兩個有 Move 的結(jié)構(gòu)Person,Car。這兩個結(jié)構(gòu)都有一個Move接受距離的函數(shù),但是,Person 距離被傳遞為float32 而 Car 接受一個int。

這兩種結(jié)構(gòu)都在同一個工作流中處理,因此我們希望在同一個函數(shù)中處理它們。

對此的泛型解決方案是創(chuàng)建泛型結(jié)構(gòu),我們可以在其中定義要在創(chuàng)建時使用的數(shù)據(jù)類型。接口解決方案是接受結(jié)構(gòu)作為輸入,并對它們進行類型斷言并轉(zhuǎn)換正確的數(shù)據(jù)類型。我們不能為它們提供共享接口,因為數(shù)據(jù)類型不一樣。

在代碼示例中,有一個泛型和舊類型斷言解決方案的實現(xiàn),類型斷言帶有后綴Regular,因此我們可以更容易地知道什么與什么解決方案相關(guān)。

在具有不同數(shù)據(jù)類型的Cars和Persons 上執(zhí)行 Move 的泛型解決方案。

package benchmarking

// Subtractable is a type constraint that defines subtractable datatypes to be used in generic functions
type Subtractable interface {
int | int64 | float32
}
// Moveable is the interace for moving a Entity
type Moveable[S Subtractable] interface {
Move(S)
}

// Car is a Generic Struct with the type S to be defined
type Car[S Subtractable] struct {
Name string
DistanceMoved S
}

// Person is a Generic Struct with the type S to be defined
type Person[S Subtractable] struct {
Name string
DistanceMoved S
}

// Person is a struct that accepts a type definition at initialization
// And uses that Type as the data type for meters as input
func (p *Person[S]) Move(meters S) {
p.DistanceMoved += meters
}
func (c *Car[S]) Move(meters S) {
c.DistanceMoved += meters
}

// Move is a generic function that takes in a Generic Moveable and moves it
func Move[S Subtractable, V Moveable[S]](v V, meters S "S Subtractable, V Moveable[S]") {
v.Move(meters)
}

類型斷言方案的 Move:

package benchmarking

// Below is the Type casting based Solution
//
type CarRegular struct {
Name string
DistanceMoved int
}

type PersonRegular struct {
Name string
DistanceMoved float32
}

func (p *PersonRegular) Move(meters float32) {
p.DistanceMoved += meters
}

func (c *CarRegular) Move(meters int) {
c.DistanceMoved += meters
}

func MoveRegular(v interface{}, distance float32) {
switch v.(type) {
case *PersonRegular:
v.(*PersonRegular).Move(distance)
case *CarRegular:
v.(*CarRegular).Move(int(distance))
default:
// Handle Unsupported types, not needed by Generic solution as Compiler does this for you
}
}

現(xiàn)在我們已經(jīng)有了解決方案,是時候開始基準(zhǔn)測試了。我將在基準(zhǔn)測試之前創(chuàng)建 Persons 和 Cars,我們將測量Move 和MoveRegular 的性能。

package benchmarking

import "testing"

func Benchmark_Structures(b *testing.B) {
// Init the structs
p := &Person[float32]{Name: "John"}
c := &Car[int]{Name: "Ferrari"}

pRegular := &PersonRegular{Name: "John"}
cRegular := &CarRegular{Name: "Ferrari"}

// Run the test
b.Run("Person_Generic_Move", func(b *testing.B) {
for i := 0; i < b.N; i++ {
// generic will try to use float64 if we dont tell it is a float32
Move[float32](p, 10.2 "float32")
}
})

b.Run("Car_Generic_Move", func(b *testing.B) {
for i := 0; i < b.N; i++ {
Move(c, 10)
}
})

b.Run("Person_Regular_Move", func(b *testing.B) {
for i := 0; i < b.N; i++ {
MoveRegular(pRegular, 10.2)
}
})

b.Run("Car_Regular_Move", func(b *testing.B) {
for i := 0; i < b.N; i++ {
MoveRegular(cRegular, 10)
}
})
}

我使用以下命令運行測試:

go test -v -bench=Benchmark_Structures -benchtime=1000000000x -count 5

運行基準(zhǔn)測試的結(jié)果:

goos: windows
goarch: amd64
pkg: programmingpercy/benchgeneric
cpu: Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz
Benchmark_Structures
Benchmark_Structures/Person_Generic_Move
Benchmark_Structures/Person_Generic_Move-4 1000000000 4.690 ns/op
Benchmark_Structures/Person_Generic_Move-4 1000000000 4.668 ns/op
Benchmark_Structures/Person_Generic_Move-4 1000000000 4.727 ns/op
Benchmark_Structures/Person_Generic_Move-4 1000000000 4.664 ns/op
Benchmark_Structures/Person_Generic_Move-4 1000000000 4.699 ns/op
Benchmark_Structures/Car_Generic_Move
Benchmark_Structures/Car_Generic_Move-4 1000000000 3.176 ns/op
Benchmark_Structures/Car_Generic_Move-4 1000000000 3.188 ns/op
Benchmark_Structures/Car_Generic_Move-4 1000000000 3.296 ns/op
Benchmark_Structures/Car_Generic_Move-4 1000000000 3.144 ns/op
Benchmark_Structures/Car_Generic_Move-4 1000000000 3.156 ns/op
Benchmark_Structures/Person_Regular_Move
Benchmark_Structures/Person_Regular_Move-4 1000000000 4.694 ns/op
Benchmark_Structures/Person_Regular_Move-4 1000000000 4.634 ns/op
Benchmark_Structures/Person_Regular_Move-4 1000000000 4.677 ns/op
Benchmark_Structures/Person_Regular_Move-4 1000000000 4.660 ns/op
Benchmark_Structures/Person_Regular_Move-4 1000000000 4.626 ns/op
Benchmark_Structures/Car_Regular_Move
Benchmark_Structures/Car_Regular_Move-4 1000000000 2.560 ns/op
Benchmark_Structures/Car_Regular_Move-4 1000000000 2.555 ns/op
Benchmark_Structures/Car_Regular_Move-4 1000000000 2.553 ns/op
Benchmark_Structures/Car_Regular_Move-4 1000000000 2.579 ns/op
Benchmark_Structures/Car_Regular_Move-4 1000000000 2.560 ns/op
PASS
ok programmingpercy/benchgeneric 75.830s

看到類型斷言解決方案比泛型解決方案更快,我有點驚訝。我確保多次運行的基準(zhǔn)測試,它不是偶然的。

我們可以從基準(zhǔn)中看到,基于 Cars 的 Int 解決方案都比基于 Person 的 float32 的更快。

Person move 方法具有相同的性能,無論是泛型解決方案還是常規(guī)解決方案。但是,你可以看到 Cars 的不同之處,類型斷言的 Cars 是最快的。類型斷言執(zhí)行比泛型快 20%。

因此,該基準(zhǔn)的關(guān)鍵要點如下。

  • 基于浮點的類型具有相同的性能,而類型斷言的整數(shù) cars 速度更快,這不是我的觀點。
  • Float32 加法比 int 慢。

結(jié)論

所以,我們現(xiàn)在已經(jīng)測試了一些我可以看到泛型有用的用例。

老實說,我確實希望第二個基準(zhǔn)也能證明泛型更快。這將進一步證明我的說法,即泛型由于是在編譯時而不是運行時決定的,因此性能更高。

通過使用泛型或特定于數(shù)據(jù)類型的函數(shù),我們可以在第一個用例中看到相當(dāng)大的性能提升。我知道幾納秒可能看起來很荒謬,但是在某些用例中,這些類型的極端優(yōu)化很重要。我曾經(jīng)做過一個高性能的網(wǎng)絡(luò)嗅探器,它必須實時處理大量的網(wǎng)絡(luò)數(shù)據(jù)。編寫這樣的軟件將需要所有的優(yōu)化。

我們已經(jīng)看到,選擇正確的數(shù)據(jù)類型會對性能產(chǎn)生很大影響。但是,我認為我們可以說,那些表示擔(dān)心泛型會拖慢軟件速度的讀者可以冷靜下來。從好的方面來說,我看到泛型解決方案允許我們更輕松地交換數(shù)據(jù)類型,從而提高性能。

另一方面,Go 中的類型斷言和類型轉(zhuǎn)換似乎具有超強的性能。

正如我們所看到的,許多因素都會對結(jié)果產(chǎn)生影響,例如使用的算術(shù)運算符[5]、數(shù)據(jù)類型等。在我的基準(zhǔn)測試中可能會出現(xiàn)我不知道的錯誤。

原文鏈接:https://programmingpercy.tech/blog/benchmarking-generics-in-go

參考資料

[1]學(xué)習(xí)泛型: https://programmingpercy.tech/blog/learning-generics-in-go

[2]學(xué)習(xí)泛型: https://programmingpercy.tech/blog/learning-generics-in-go

[3]Playground: https://go.dev/play/p/BLU8pHOzmvS

[4]教程: https://betterprogramming.pub/we-measure-the-power-of-cars-computers-and-cellphones-but-what-about-code-91ed5583f298

[5]算術(shù)運算符: https://www.techopedia.com/definition/25582/arithmetic-operator

責(zé)任編輯:武曉燕 來源: 幽鬼
相關(guān)推薦

2021-09-29 18:17:30

Go泛型語言

2024-10-28 00:40:49

Go語法版本

2022-07-12 06:17:43

GoogleGolang開發(fā)工作

2023-07-31 09:13:13

ValidatorGolang

2022-03-28 13:34:26

Go泛型部署泛型

2023-11-03 14:02:04

Go切片泛型庫

2021-11-27 22:20:13

SlicesGo泛型

2023-11-29 08:19:45

Go泛型缺陷

2023-10-08 16:28:36

數(shù)據(jù)庫DuckDB

2016-09-23 16:36:25

LinuxPCPhoronix

2024-03-06 18:09:06

Linux性能工具

2021-12-05 23:45:23

Go泛型Maps

2021-12-15 10:23:56

Go 1.18 Bet語言泛型

2022-04-15 09:55:59

Go 泛型Go 程序函數(shù)

2024-04-10 07:32:55

Proxy瀏覽器safari

2021-07-17 15:25:05

PHP 8.1基準(zhǔn)測試開發(fā)

2023-11-26 19:06:13

GO測試

2025-11-05 03:00:55

2021-12-01 08:29:17

Go泛型Maps

2025-01-08 08:47:56

點贊
收藏

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

亚洲av成人片色在线观看高潮| 中文一区一区三区高中清不卡| 亚洲福利视频一区| 日韩国产一区三区| 永久免费精品视频网站| 久久一区二区三区视频| 欧美1区2区3| 国产精品乱人伦| 日本最新高清不卡中文字幕| 无码人妻丰满熟妇区毛片蜜桃精品| 岛国视频免费在线观看| 国产69精品久久久久9999人| 99精品国产一区二区三区不卡| 欧美xxxx14xxxxx性爽| 欧美黄色性生活| 日本在线一二三| 亚洲黄色影院| 精品国产一二三区| 乱熟女高潮一区二区在线| 在线免费av片| 日本一区二区免费高清| 色综合久久六月婷婷中文字幕| 91九色露脸| 婷婷伊人五月天| 日韩一区中文| 中文字幕av一区二区三区高 | 午夜剧场免费在线观看| 久久人人爽人人爽人人片av不| 日韩美女精品在线| 国产精品一区二区女厕厕| 亚洲欧美va天堂人熟伦| 成人午夜亚洲| 黑人精品xxx一区一二区| 精品999在线观看| 人人干人人干人人干| 欧美一区二区三区红桃小说| 激情成人中文字幕| 久久综合中文色婷婷| 久热这里只有精品6| 久久久久久久久久久久久久久久久久| 欧美日韩精品电影| 一区二区免费电影| 精品免费久久久| 亚洲国产高清一区| 欧美精品生活片| 91麻豆精品成人一区二区| 国产永久精品大片wwwapp| 在线免费亚洲电影| 中文字幕一区综合| 成人好色电影| 国产亚洲福利社区一区| 国产精品亚洲片夜色在线| 成人免费a视频| 激情成人亚洲| 亚洲无av在线中文字幕| 国产九九在线观看| 免费污视频在线| 久久久三级国产网站| 国产欧美一区二区三区久久人妖 | 亚洲精品成人少妇| 99理论电影网| 国产高清中文字幕| 亚洲成人国产| 久久视频精品在线| 欧美精品欧美极品欧美激情| 一区二区三区四区视频免费观看 | 99re热视频这里只精品| 国产日本一区二区三区| 性无码专区无码| 亚洲欧美日韩精品一区二区 | 丰满少妇一区二区三区| av免费在线一区| 亚洲人成网站影音先锋播放| 97国产超碰| 亚洲不卡免费视频| 日本欧美久久久久免费播放网| 麻豆国产精品va在线观看不卡 | 亚洲一区二区精品视频| 久久精品五月婷婷| 国产美女永久免费| 国产日韩欧美一区| 久久亚洲精品成人| 九九视频在线免费观看| 国产va免费精品观看精品视频| 亚洲欧美国产精品va在线观看| 欧美一级免费在线| 都市激情亚洲综合| 亚洲制服丝袜av| 夜夜爽www精品| 成人免费在线| 国产精品久久久久影院老司| 黄色网zhan| www日韩tube| 日韩美女视频一区| 国产白丝袜美女久久久久| av网站在线免费看推荐| 国产欧美日韩综合精品一区二区| 国产精品国色综合久久| 国产精品视频a| 蜜芽一区二区三区| 国产成人亚洲精品| 欧美黑人一区二区| 狠狠色丁香婷综合久久| 国产精品视频xxx| 91麻豆精品在线| 久久久综合网| 国产成人avxxxxx在线看| 亚洲一级在线播放| 99视频有精品| 国产一区二区精品在线| 成人综合影院| 亚洲大片精品永久免费| 污污网站免费观看| 欧美电影在线观看免费| 日韩视频中文字幕| 超碰人人干人人| 波多野结衣一区| 亚洲一区二区久久久| 国产美女福利视频| 日韩黄色一级片| 国产精品扒开腿爽爽爽视频| 亚洲大片免费观看| 日韩精彩视频在线观看| 国产嫩草一区二区三区在线观看| www在线免费观看| 色综合久久久久综合体| 人妻体体内射精一区二区| 精品99re| 最新国产成人av网站网址麻豆| 超碰人人干人人| 欧美亚洲三级| 精品欧美一区二区在线观看视频| 日本精品一区二区三区在线播放| 亚洲欧美日本在线| 日本黄色片一级片| 日本免费一区二区六区| 色哟哟精品一区| 欧美极品jizzhd欧美仙踪林| 久久精品亚洲成在人线av网址| 久久久精品久久久久| 激情视频在线播放| 精品一区二区成人精品| 相泽南亚洲一区二区在线播放 | 久久成人免费视频| 中文字幕精品一区二区精| 免费在线观看成人| 欧美不卡三区| 欧美magnet| 欧美日本一区二区| gv天堂gv无码男同在线观看| 久久久精品日韩| 成人免费网站在线| 亚洲av无码片一区二区三区| 国产精品家庭影院| www.亚洲成人网| 日本一区二区三区视频在线看 | 国产精品极品美女在线观看免费| 无码精品人妻一区二区三区影院 | 老司机福利在线观看| 国产精品88久久久久久| 欧美多人爱爱视频网站| 一级片中文字幕| 91丨九色porny丨蝌蚪| 亚洲欧洲日韩综合二区| 亚洲妇熟xxxx妇色黄| 色综合天天性综合| 永久免费成人代码| 欧美激情五月| 国产精品扒开腿做| 欧美日韩在线资源| 富二代精品短视频| av黄色免费网站| 欧美韩日精品| 国产精品白丝jk喷水视频一区| 好男人免费精品视频| 一区二区三区在线观看动漫| 欧美性猛交xx| 日韩午夜在线电影| 91在线免费视频| 2019中文字幕在线视频| 大桥未久av一区二区三区| 中文字幕av网址| 亚洲国产二区| 奇米影视首页 狠狠色丁香婷婷久久综合| 男人天堂手机在线| 欧美成人欧美edvon| 天堂网av2018| 国产精品亚洲一区二区三区在线| 日韩高清在线播放| 黄色软件视频在线观看| 日韩欧美一区在线| 欧日韩不卡视频| 成人免费高清视频在线观看| 亚洲自拍三区| 精品日产乱码久久久久久仙踪林| 国产v综合ⅴ日韩v欧美大片| 国内外激情在线| 欧美三区在线视频| 亚洲女优在线观看| 国产在线观看一区二区| 亚洲高清视频一区| 午夜久久av| 国产精品久久久91| 久久av色综合| 色妞久久福利网| 日韩在线观看视频一区二区三区 | 亚洲激情图片| 日韩三级视频| 亚州av一区二区| 在线观看视频二区| 亚洲成人精品在线观看| 99久久99久久精品免费| 成人国产亚洲欧美成人综合网| 影音先锋成人资源网站| 精品国产亚洲一区二区在线观看 | 中文成人激情娱乐网| 国产一区二区成人| 欧美视频一二区| 91麻豆精品国产91久久久久 | 先锋av资源站| 欧美一区午夜视频在线观看| 另类视频在线观看| 国产黄色一级大片| 亚洲精品免费在线播放| 超薄肉色丝袜一二三| 99综合电影在线视频| 99精品视频免费版的特色功能| 天天影视综合| 四虎永久国产精品| 亚洲第一二三区| 国产ts人妖一区二区三区| av在线下载| www国产精品视频| 91美女视频在线| 一区二区三区回区在观看免费视频| 免费黄色av片| 午夜精品福利在线| 色综合99久久久无码国产精品| 国产乱码字幕精品高清av| 亚洲一级免费观看| 日韩精品久久理论片| 日本熟妇人妻xxxxx| 日韩免费看片| 亚洲成人午夜在线| 成人女性视频| 亚洲激情一区二区| 99国内精品久久久久久久| 亚洲 国产 日韩 综合一区| 国产一区二区三区四区| 欧美在线激情| 欧美日韩一二三四| 99视频在线播放| 国产剧情一区二区在线观看| 韩国福利视频一区| 国产福利电影在线播放| 4p变态网欧美系列| 黄色动漫在线观看| 久久伊人91精品综合网站| 看黄网站在线观看| 欧美国产日韩一区| a级片免费在线观看| 亚洲最大中文字幕| a天堂中文在线88| 日韩性生活视频| 91麻豆免费在线视频| 欧美日韩福利在线观看| 国产高清一区在线观看| 在线播放日韩av| fc2ppv国产精品久久| 欧美激情小视频| 在线观看免费版| 免费91麻豆精品国产自产在线观看| www免费视频观看在线| 欧美日本亚洲视频| 老色鬼在线视频| 国产精品老牛影院在线观看| 欧美一级在线| 粉嫩av四季av绯色av第一区 | 国产美女91呻吟求| 国产精一区二区| 久久99精品久久久水蜜桃| 国产一区二区三区四区五区传媒 | 亚洲熟女乱综合一区二区三区| 26uuu国产在线精品一区二区| 丰满少妇高潮一区二区| 亚洲欧洲三级电影| 日本五十路女优| 亚洲色图清纯唯美| 国产一级中文字幕| 亚洲欧美偷拍三级| 日本一区二区欧美| 日本韩国欧美三级| 6080午夜伦理| 亚洲h动漫在线| 中文字幕乱码视频| 精品少妇一区二区三区视频免付费| 四虎影视精品成人| 亚洲精品mp4| 亚洲精选一区二区三区| 亚洲女人初尝黑人巨大| www.欧美日本韩国| 国产z一区二区三区| 北条麻妃一区二区三区在线| 91在线免费观看网站| 网红女主播少妇精品视频| 中文字幕日韩一区二区三区不卡| 亚洲深夜影院| 少妇愉情理伦片bd| 国产日韩欧美a| 在线观看免费国产视频| 欧美电影影音先锋| 国产色视频在线| 亚洲无线码在线一区观看| 菠萝蜜视频在线观看www入口| 九九久久精品一区| 韩国精品主播一区二区在线观看 | 成人在线视频观看| 狠狠色噜噜狠狠狠狠色吗综合| 999国产精品永久免费视频app| 午夜一区二区三区| 亚洲看片一区| www.欧美com| 最新欧美精品一区二区三区| 国产中文字幕视频| 亚洲第一二三四五区| 日本高清视频免费看| 不卡av电影院| 亚洲一区有码| 偷拍视频一区二区| 天堂一区二区在线免费观看| 国产精品无码专区| 亚洲国产精品精华液网站| 国产成人精品av在线观| 最新91在线视频| 麻豆久久久久| 99久久伊人精品影院| 欧美电影免费播放| 激情 小说 亚洲 图片: 伦| 久久久精品天堂| 日韩在线播放中文字幕| 亚洲另类激情图| 中文字幕在线免费观看视频| 国产精品国产亚洲伊人久久| 日韩高清一级| 2022亚洲天堂| 蜜桃久久久久久| 亚洲综合第一区| 欧美日韩成人综合天天影院| 成人在线免费看| 国产精品久久久久福利| 成人看的羞羞网站| 成人性生生活性生交12| 国产精品一二三四| 777777国产7777777| 日韩一区二区三区在线观看| 十八禁一区二区三区| 在线日韩中文字幕| 日韩高清成人| 亚洲欧美日韩在线综合| 麻豆精品在线播放| 国产麻豆剧传媒精品国产av| 国产日本一区二区| 亚洲精品一区二三区| 日韩精品专区在线影院重磅| 1区2区在线观看| 国产高清一区视频| 国产一区二区三区久久| 99久久久无码国产精品性| 欧美一a一片一级一片| 欧美天堂在线视频| 91国语精品自产拍在线观看性色 | 久久婷婷人人澡人人喊人人爽| 99国产精品| 精品人妻一区二区三区蜜桃视频| 91官网在线免费观看| 免费大片黄在线| 产国精品偷在线| 久久深夜福利| 久久av红桃一区二区禁漫| 狠狠久久五月精品中文字幕| 欧洲天堂在线观看| 成人久久久久久| 一本久道综合久久精品| 免费黄在线观看| 日韩精品一区二区三区视频播放 | 亚洲男女av一区二区| 精品久久久久久久免费人妻| 亚洲国产高清在线| 性生交生活影碟片| 日本久久久久亚洲中字幕| 99久久夜色精品国产亚洲1000部| 国内自拍偷拍视频| 91成人在线免费观看| 亚洲www色| 天堂精品一区二区三区| 成人午夜视频在线观看| 欧美一级黄视频| 久久久女人电视剧免费播放下载| 国产午夜久久av| 日日橹狠狠爱欧美超碰|