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

面向接口編程,你考慮過性能嗎?

開發(fā) 前端
大家在平時開發(fā)中大多都會遵循接口編程,這樣就可以方便實現(xiàn)依賴注入也方便實現(xiàn)多態(tài)等各種小技巧,但這種是以犧牲性能為代價換取代碼的靈活性,萬物皆有陰陽,看你的應用場景進行取舍。

大家在平時開發(fā)中大多都會遵循接口編程,這樣就可以方便實現(xiàn)依賴注入也方便實現(xiàn)多態(tài)等各種小技巧,但這種是以犧牲性能為代價換取代碼的靈活性,萬物皆有陰陽,看你的應用場景進行取舍。

一:背景

1. 緣由

在項目的性能改造中,發(fā)現(xiàn)很多方法簽名的返回值都是采用IEnumerable接口,比如下面這段代碼:

public static void Main(string[] args)
        {
            var list = GetHasEmailCustomerIDList();

            foreach (var item in list){}

             Console.ReadLine();
        }

        public static IEnumerable<int> GetHasEmailCustomerIDList()
        {
            return Enumerable.Range(1, 5000000).ToArray();
        }

2. 有什么問題

這段代碼乍一看也沒啥什么性能問題,foreach迭代天經(jīng)地義,這個還能怎么優(yōu)化???

<1> 從MSIL中尋找問題

首先我們盡可能把原貌還原出來,簡化后的MSIL如下。

.method public hidebysig static 
    void Main (
        string[] args
    ) cil managed
{
    IL_0009: callvirt instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>::GetEnumerator()
    IL_000e: stloc.1
    .try
    {
        IL_000f: br.s IL_001a
        // loop start (head: IL_001a)
            IL_0011: ldloc.1
            IL_0012: callvirt instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>::get_Current()
            IL_0017: stloc.2
            IL_0018: nop
            IL_0019: nop

            IL_001a: ldloc.1
            IL_001b: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
            IL_0020: brtrue.s IL_0011
        // end loop

        IL_0022: leave.s IL_002f
    } // end .try
    finally
    {
        IL_0024: ldloc.1
        IL_0025: brfalse.s IL_002e

        IL_0027: ldloc.1
        IL_0028: callvirt instance void [mscorlib]System.IDisposable::Dispose()
        IL_002d: nop

        IL_002e: endfinally
    } // end handler

    IL_002f: ret
} // end of method Program::Main

從IL中看到了標準的get_Current,MoveNext,Dispose 還有一個try,finally,一下子多了這么多方法和關鍵詞,不就是一個簡單的foreach迭代數(shù)組嘛?至于搞的這么復雜嘛?這樣在大數(shù)據(jù)下怎么快的起來?

還有一個奇葩的事,如果你仔細觀察IL代碼,比如這句:[mscorlib]System.Collections.Generic.IEnumerable``1<int32>::GetEnumerator(), 這個GetEnumerator前面是接口IEnumerable,正常情況下應該是具體迭代類吧,按理說應該會調(diào)用Array的GetEnumerator方法,如下所示。

[Serializable]
[ComVisible(true)]
[__DynamicallyInvokable]
public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable
{
    [__DynamicallyInvokable]
    public IEnumerator GetEnumerator()
    {
        int lowerBound = GetLowerBound(0);
        if (Rank == 1 && lowerBound == 0)
        {
            return new SZArrayEnumerator(this);
        }
        return new ArrayEnumerator(this, lowerBound, Length);
    }
}

<2> 從windbg中尋找問題

IL中發(fā)現(xiàn)的第二個問題我特別好奇,????,我們到托管堆上去看下到底是哪一個具體類調(diào)用了GetEnumerator()方法。

!clrstack -l > !do xx 到線程棧上抓list變量

0:000> !clrstack -l
000000229e3feda0 00007ff889e40951 *** WARNING: Unable to verify checksum for ConsoleApp2.exe
ConsoleApp2.Program.Main(System.String[]) [C:\dream\Csharp\ConsoleApp1\ConsoleApp2\Program.cs @ 32]
    LOCALS:
        0x000000229e3fede8 = 0x0000019bf33b9a88
        0x000000229e3fede0 = 0x0000019be33b2d90
        0x000000229e3fedfc = 0x00000000004c4b40

0:000> !do 0x0000019be33b2d90
Name:        System.SZArrayHelper+SZGenericArrayEnumerator`1[[System.Int32, mscorlib]]
MethodTable: 00007ff8e8d36d18
EEClass:     00007ff8e7cf5640
Size:        32(0x20) bytes
File:        C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007ff8e7a98538  4002ffe        8       System.Int32[]  0 instance 0000019bf33b9a88 _array
00007ff8e7a985a0  4002fff       10         System.Int32  1 instance          5000000 _index
00007ff8e7a985a0  4003000       14         System.Int32  1 instance          5000000 _endIndex
00007ff8e8d36d18  4003001        0 ...Int32, mscorlib]]  0   shared           static Empty
                                 >> Domain:Value dynamic statics NYI 0000019be1893a80:NotInit  <<

居然有這么一個類型 Name: System.SZArrayHelper+SZGenericArrayEnumerator,然來是JIT搗的鬼,生成了這么一個SZGenericArrayEnumerator類型,接下來把它的方法表打出來看看里面都有啥方法。

0:000> !dumpmt -md 00007ff8e8d36d18
EEClass:         00007ff8e7cf5640
Module:          00007ff8e7a71000
Name:            System.SZArrayHelper+SZGenericArrayEnumerator`1[[System.Int32, mscorlib]]
mdToken:         0000000002000a98
File:            C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
BaseSize:        0x20
ComponentSize:   0x0
Slots in VTable: 11
Number of IFaces in IFaceMap: 3
--------------------------------------
MethodDesc Table
           Entry       MethodDesc    JIT Name
00007ff8e7ff2450 00007ff8e7a78de8 PreJIT System.Object.ToString()
00007ff8e800cc60 00007ff8e7c3b9b0 PreJIT System.Object.Equals(System.Object)
00007ff8e7ff2090 00007ff8e7c3b9d8 PreJIT System.Object.GetHashCode()
00007ff8e7fef420 00007ff8e7c3b9e0 PreJIT System.Object.Finalize()
00007ff8e8b99fd0 00007ff8e7ebf388 PreJIT System.SZArrayHelper+SZGenericArrayEnumerator`1[[System.Int32, mscorlib]].MoveNext()
00007ff8e8b99f90 00007ff8e7ebf390 PreJIT System.SZArrayHelper+SZGenericArrayEnumerator`1[[System.Int32, mscorlib]].get_Current()
00007ff8e8b99f60 00007ff8e7ebf398 PreJIT System.SZArrayHelper+SZGenericArrayEnumerator`1[[System.Int32, mscorlib]].System.Collections.IEnumerator.get_Current()
00007ff8e8b99f50 00007ff8e7ebf3a0 PreJIT System.SZArrayHelper+SZGenericArrayEnumerator`1[[System.Int32, mscorlib]].System.Collections.IEnumerator.Reset()
00007ff8e8b99f40 00007ff8e7ebf3a8 PreJIT System.SZArrayHelper+SZGenericArrayEnumerator`1[[System.Int32, mscorlib]].Dispose()
00007ff8e8b99ef0 00007ff8e7ebf3b0 PreJIT System.SZArrayHelper+SZGenericArrayEnumerator`1[[System.Int32, mscorlib]]..cctor()
00007ff8e8b99ff0 00007ff8e7ebf380 PreJIT System.SZArrayHelper+SZGenericArrayEnumerator`1[[System.Int32, mscorlib]]..ctor(Int32[], Int32)

可以看到這是一個標準的迭代類,這性能又被拖累了。。。

二:優(yōu)化性能

綜合上面分析,貌似問題出在了 foreach 和 IEnumerable<int>這兩個方面。

1. IEnumerable 替換 int[], foreach改成for

知道了這兩點,接下來把代碼修改如下:

public static void Main(string[] args)
        {
            var list = GetHasEmailCustomerIDList();

            for (int i = 0; i < list.Length; i++) { }

            Console.ReadLine();
        }

        public static int[] GetHasEmailCustomerIDList()
        {
            return Enumerable.Range(1, 5000000).ToArray();
        }

.method public hidebysig static 
    void Main (
        string[] args
    ) cil managed
{
    // (no C# code)
    IL_0000: nop
    // int[] hasEmailCustomerIDList = GetHasEmailCustomerIDList();
    IL_0001: call int32[] ConsoleApp2.Program::GetHasEmailCustomerIDList()
    IL_0006: stloc.0
    // for (int i = 0; i < hasEmailCustomerIDList.Length; i++)
    IL_0007: ldc.i4.0
    IL_0008: stloc.1
    // (no C# code)
    IL_0009: br.s IL_0011
    // loop start (head: IL_0011)
        IL_000b: nop
        IL_000c: nop
        // for (int i = 0; i < hasEmailCustomerIDList.Length; i++)
        IL_000d: ldloc.1
        IL_000e: ldc.i4.1
        IL_000f: add
        IL_0010: stloc.1

        // for (int i = 0; i < hasEmailCustomerIDList.Length; i++)
        IL_0011: ldloc.1
        IL_0012: ldloc.0
        IL_0013: ldlen
        IL_0014: conv.i4
        IL_0015: clt
        IL_0017: stloc.2
        IL_0018: ldloc.2
        // (no C# code)
        IL_0019: brtrue.s IL_000b
    // end loop

    // Console.ReadLine();
    IL_001b: call string [mscorlib]System.Console::ReadLine()
    // (no C# code)
    IL_0020: pop
    // }
    IL_0021: ret
} // end of method Program::Main

可以看到上面的IL指令都是非?;A的指令,大多都有CPU指令直接提供支持,非常簡潔,大愛~~~

這里有一點要注意:我后來觀察foreach不需要改成for,vs編輯器在底層幫我們轉換了,看的出來foreach在迭代數(shù)組類型的時候還是非常智能的,知道怎么幫助我們優(yōu)化。。。修改代碼如下:

public static void Main(string[] args)
        {
            var list = GetHasEmailCustomerIDList();

            //for (int i = 0; i < list.Length; i++) { }
            foreach (var item in list) { }

            Console.ReadLine();
        }

.method public hidebysig static 
    void Main (
        string[] args
    ) cil managed
{
    // (no C# code)
    IL_0000: nop
    // int[] hasEmailCustomerIDList = GetHasEmailCustomerIDList();
    IL_0001: call int32[] ConsoleApp2.Program::GetHasEmailCustomerIDList()
    IL_0006: stloc.0
    // (no C# code)
    IL_0007: nop
    // int[] array = hasEmailCustomerIDList;
    IL_0008: ldloc.0
    IL_0009: stloc.1
    // for (int i = 0; i < array.Length; i++)
    IL_000a: ldc.i4.0
    IL_000b: stloc.2
    // (no C# code)
    IL_000c: br.s IL_0018
    // loop start (head: IL_0018)
        // int num = array[i];
        IL_000e: ldloc.1
        IL_000f: ldloc.2
        IL_0010: ldelem.i4
        // (no C# code)
        IL_0011: stloc.3
        IL_0012: nop
        IL_0013: nop
        // for (int i = 0; i < array.Length; i++)
        IL_0014: ldloc.2
        IL_0015: ldc.i4.1
        IL_0016: add
        IL_0017: stloc.2

        // for (int i = 0; i < array.Length; i++)
        IL_0018: ldloc.2
        IL_0019: ldloc.1
        IL_001a: ldlen
        IL_001b: conv.i4
        IL_001c: blt.s IL_000e
    // end loop

    // Console.ReadLine();
    IL_001e: call string [mscorlib]System.Console::ReadLine()
    // (no C# code)
    IL_0023: pop
    // }
    IL_0024: ret
} // end of method Program::Main

2. 代碼測試

微觀方面已經(jīng)帶大家分析過了,接下來宏觀測試兩種方式的性能到底相差多少,每一個方法我都做10次性能對比。

public static void Main(string[] args)
        {
            var arr = GetHasEmailCustomerIDArray();

            for (int i = 0; i < 10; i++)
            {
                var watch = Stopwatch.StartNew();
                foreach (var item in arr) { }
                watch.Stop();
                Console.WriteLine($"i={i},時間:{watch.ElapsedMilliseconds}");
            }
            Console.WriteLine("---------------");
            var list = arr as IEnumerable<int>;
            for (int i = 0; i < 10; i++)
            {
                var watch = Stopwatch.StartNew();
                foreach (var item in list) { }
                watch.Stop();
                Console.WriteLine($"i={i},時間:{watch.ElapsedMilliseconds}");
            }
            Console.ReadLine();
        }

        public static int[] GetHasEmailCustomerIDArray()
        {
            return Enumerable.Range(1, 5000000).ToArray();
        }

i=0,時間:10
i=1,時間:10
i=2,時間:10
i=3,時間:9
i=4,時間:9
i=5,時間:9
i=6,時間:10
i=7,時間:10
i=8,時間:12
i=9,時間:12
---------------
i=0,時間:45
i=1,時間:37
i=2,時間:35
i=3,時間:35
i=4,時間:37
i=5,時間:35
i=6,時間:36
i=7,時間:37
i=8,時間:35
i=9,時間:36

難以置信的是居然有3-4倍的差距。。。這就是用靈活性換取性能的代價??????

責任編輯:武曉燕 來源: 一線碼農(nóng)聊技術
相關推薦

2021-07-12 07:59:05

對象接口編程

2013-07-30 09:42:41

實現(xiàn)編程接口編程對象編程

2015-10-26 09:52:26

bat裁員信息安全

2024-04-24 13:59:02

云原生應用

2016-04-19 16:01:05

2020-07-23 17:29:47

接口編程代碼

2021-01-14 08:16:41

Python接口編程

2024-08-05 01:24:54

2020-06-20 14:09:01

信息安全數(shù)據(jù)技術

2009-07-02 13:25:00

消除實現(xiàn)繼承面向接口編程Java

2023-07-06 08:31:50

Python對象編程

2021-09-25 13:12:47

數(shù)據(jù)開發(fā)架構

2020-03-11 20:42:34

瀏覽器緩存機制

2021-05-28 05:34:06

Golang語言編程

2023-10-13 07:36:58

Java函數(shù)式編程

2012-02-01 10:18:23

編程

2022-04-28 08:12:29

函數(shù)調(diào)用進程切換代碼

2023-05-29 08:11:42

@Value注解Bean

2022-01-05 12:03:48

MySQL索引數(shù)據(jù)

2023-03-13 13:36:00

Go擴容切片
點贊
收藏

51CTO技術棧公眾號

伊人网在线免费| 成人激情在线播放| 大又大又粗又硬又爽少妇毛片 | 美女黄色片视频| 五月天婷婷在线视频| 国产成人午夜高潮毛片| 国产91ⅴ在线精品免费观看| 欧美巨胸大乳hitomi| 日韩在线亚洲| 色婷婷狠狠综合| 特级西西444| 嫩草在线播放| 国产精品99久久久久久久女警 | 91成人在线观看喷潮教学| 精品资源在线看| 国产大片一区二区| 国产精品夫妻激情| 好吊妞视频一区二区三区| 99久久99久久精品国产片桃花| 亚洲国产成人在线播放| 久久人人爽av| 免费欧美电影| 偷窥少妇高潮呻吟av久久免费| 一区二区精品视频| 免费毛片在线| 播五月开心婷婷综合| 91精品国产综合久久香蕉最新版 | 香蕉影院在线观看| 欧美日韩福利| 久久久精品电影| 亚洲精品一区二区三区影院忠贞| 加勒比久久高清| 日韩精品一区二区三区视频在线观看| 婷婷丁香激情网| 在线观看欧美日韩电影| 午夜久久久影院| 日韩精品一区二区免费| 欧美18一19xxx性| 国产日产欧产精品推荐色 | 亚洲 美腿 欧美 偷拍| 国产乱码一区二区三区| 国产欧美 在线欧美| 无码人妻熟妇av又粗又大| 一区二区国产在线观看| 久久久久久久久久国产| 久久国产免费观看| 正在播放日韩欧美一页| 精品久久久91| 日韩欧美123区| 亚洲国产精品久久久久蝴蝶传媒| 色婷婷综合久久久久| 国产123在线| 欧美一区二区三区激情视频| 亚洲人成在线播放| 亚洲精品一区二区三区影院忠贞| 欧美男男gaytwinkfreevideos| 日韩精品免费视频| 在线免费观看成年人视频| 欧美亚洲国产日韩| 亚洲精品久久久久久下一站 | 国产日韩三级在线| 午夜老司机精品| 1区2区3区在线观看| 国产精品蜜臀在线观看| 影音先锋亚洲视频| av观看在线| 亚洲线精品一区二区三区 | 日韩国产高清影视| 国产精品久久久久久搜索 | 精品国产91乱码一区二区三区| 日本成人在线免费观看| 无码国模国产在线观看| 精品国产乱码久久久久久图片| 无码av免费精品一区二区三区| 免费看成人人体视频| 国产丝袜一区二区三区免费视频 | 黑人乱码一区二区三区av| 国产a久久麻豆| 久久精品国产精品青草色艺| 精品推荐蜜桃传媒| 国产精品福利一区二区三区| a级片一区二区| 在线男人天堂| 欧美欧美午夜aⅴ在线观看| 亚洲一区二区三区四区精品| 白嫩白嫩国产精品| 中文字幕av一区| 国产精品成人久久| 日本aⅴ亚洲精品中文乱码| 96国产粉嫩美女| 天堂资源最新在线| 国产精品久久久久三级| 免费网站永久免费观看| 在线最新版中文在线| 欧美日韩精品一区二区天天拍小说 | 青青草97国产精品免费观看| 91影院未满十八岁禁止入内| 亚州精品国产精品乱码不99按摩| 国产精品乱子久久久久| 丁香花在线影院观看在线播放| 日韩精品影片| 精品国产乱码久久久久久老虎| 真实乱视频国产免费观看| 天天射综合网视频| 日韩av免费在线| av男人天堂网| 国产欧美一区二区精品婷婷| 久久亚洲国产成人精品无码区 | 亚洲一区二区日本| 男女网站在线观看| 亚洲愉拍自拍另类高清精品| 免费激情视频在线观看| jizzjizzjizz欧美| 中文字幕综合在线| 91九色丨porny丨肉丝| 久久国产日韩欧美精品| 久久综合一区二区三区| 色呦呦在线资源| 欧美日韩三级在线| 9.1成人看片| 激情欧美丁香| 91香蕉亚洲精品| 91福利在线视频| 一本一本久久a久久精品综合麻豆| 亚洲av无一区二区三区久久| 日韩欧美国产精品综合嫩v| 51久久精品夜色国产麻豆| 99视频国产精品免费观看a | 五月天男人天堂| 日韩和的一区二在线| 亚洲精品电影网| 青娱乐国产盛宴| 韩国v欧美v日本v亚洲v| 亚洲欧美日韩不卡一区二区三区| 最新欧美色图| 精品无人国产偷自产在线| 毛片a片免费观看| 国产美女在线精品| 久久国产精品免费观看| 小说区图片区亚洲| 日韩在线观看你懂的| 中文字幕码精品视频网站| 久久久午夜精品| 成年人视频网站免费观看| 第一区第二区在线| 久久久中精品2020中文| 免费看国产片在线观看| 亚洲线精品一区二区三区| 亚洲乱妇老熟女爽到高潮的片 | 黄色成人一级片| 亚洲国产精品一区二区久久恐怖片 | 亚洲欧洲成人精品av97| 午夜精品在线免费观看| 欧美3p视频| 成人国产精品一区| 伊人手机在线| 精品国产髙清在线看国产毛片| 青青草成人免费| 国产91精品入口| 国产二级片在线观看| 台湾亚洲精品一区二区tv| 欧美又大粗又爽又黄大片视频| 深夜福利在线看| 色欧美日韩亚洲| 岛国片在线免费观看| 九九视频精品免费| 99热这里只有精品免费| 国产精品调教视频| 欧美做爰性生交视频| av片在线看| 欧美一区二区三区免费在线看 | 国产无套精品一区二区| 男人久久天堂| 色爱av美腿丝袜综合粉嫩av | 国产美女久久久久| 国产免费黄色一级片| 亚洲毛片免费看| 国产日韩精品一区二区| 久草免费在线色站| 亚洲区一区二区| 国产美女免费看| 欧美日韩视频在线| 91香蕉视频网| 不卡的av网站| 亚洲欧美手机在线| 日韩午夜免费| 在线免费观看一区二区三区| 91嫩草精品| 国产精品日韩在线观看| 日本成人不卡| 亚洲人成网站免费播放| 国产成人三级一区二区在线观看一| 精品国产91久久久久久老师| 91麻豆制片厂| 成人美女视频在线观看| 乌克兰美女av| 亚洲精品四区| www亚洲国产| 亚洲性视频大全| 91亚色免费| jizz欧美| 欧美亚洲另类在线| 中文字幕在线播放网址| 亚洲欧美国产精品va在线观看| 国产丝袜在线视频| 日韩欧美在线观看| 激情五月婷婷在线| 国产精品乱人伦一区二区| 三级电影在线看| 国产精品18久久久| 久久久精品高清| 久久中文字幕一区二区三区| 伊人久久在线观看| 精品国产一区探花在线观看 | 亚洲国产精品嫩草影院| 国产在线免费av| 91色|porny| 亚洲国产精品狼友在线观看| 免费观看30秒视频久久| 日日橹狠狠爱欧美超碰| 国产在线不卡| 艳母动漫在线免费观看| 欧美日韩激情在线一区二区三区| 国产欧美一区二区在线播放| 久久国产精品美女| 成人国产精品色哟哟| 国产成人久久精品麻豆二区| 欧美一区二区大胆人体摄影专业网站| 日本高清成人vr专区| 久久精品久久久久久| 日本中文字幕在线播放| 亚洲人在线视频| 极品白浆推特女神在线观看 | 国产高清一区视频| 久久国产精品美女| 91久久精品美女高潮| 久久亚洲人体| 国产精品夫妻激情| 素人啪啪色综合| 国产精品激情自拍| 麻豆精品蜜桃| 国产精品久久久999| 欧美成人精品三级网站| 国产精品7m视频| 国产一区二区三区朝在线观看| 国产91色在线| 亚洲高清黄色| 国产精品极品美女在线观看免费| 台湾佬中文娱乐久久久| 国产精彩精品视频| 免费高清视频在线一区| 国产精品久久久久久久av电影| 秋霞国产精品| 91久久精品日日躁夜夜躁国产| 疯狂欧洲av久久成人av电影| 亚洲一区久久久| 中文字幕一区二区三区中文字幕 | 伊人免费在线| 久久艳片www.17c.com| 影音先锋男人资源在线| 久久久久久久国产| 竹内纱里奈兽皇系列在线观看| 国产999在线| 欧美一区=区三区| 亚洲一区二区中文| 国产精品调教| 无码免费一区二区三区免费播放 | 欧美在线观看视频一区二区三区| 亚洲精品毛片一区二区三区| 欧美男女性生活在线直播观看| 国产熟女一区二区丰满| 亚洲成人av在线播放| 欧洲综合视频| 精品国内亚洲在观看18黄 | 亚洲视频电影在线| 少妇高潮毛片色欲ava片| 日日夜夜精品视频天天综合网| 亚洲免费看av| 国产精品1024久久| 无码人妻精品一区二区三应用大全| 中文字幕精品一区二区精品绿巨人 | 国产成人亚洲综合91精品| 免费视频成人| 97久草视频| 丝袜美腿综合| 亚洲天堂第一区| 一本一本久久| 捷克做爰xxxⅹ性视频| 99久久免费精品| 秋霞欧美一区二区三区视频免费| 亚洲一区二区高清| 日韩久久久久久久久久| 欧美不卡视频一区| 国产精品久久久久久久龚玥菲 | 波多野结衣av无码| 日韩亚洲欧美综合| 东凛在线观看| 国内外成人免费激情在线视频网站 | 五月天婷婷色综合| 欧美性69xxxx肥| 午夜精品久久久久久久99热黄桃| 亚洲图片欧洲图片av| 成人影院在线播放| 国产精品看片资源| 日韩欧美国产大片| av影院在线播放| 麻豆成人综合网| 少妇按摩一区二区三区| 伊人婷婷欧美激情| 亚洲天堂777| 亚洲天堂av女优| cao在线视频| 96久久精品| 天天超碰亚洲| 黄色aaa级片| 久久午夜电影网| 日韩乱码在线观看| 日韩免费观看高清完整版在线观看| www.亚洲.com| 国产成人精品在线视频| 麻豆精品99| a级黄色小视频| 国产69精品久久久久毛片| 久艹在线观看视频| 欧美日韩一级片在线观看| 欧美色视频免费| 97精品伊人久久久大香线蕉 | 免费在线成人av| 99热在线精品观看| 韩国三级视频在线观看| 亚洲精品伦理在线| 国产精品一区二区免费视频| 一区二区三区视频观看| 久久uomeier| 欧洲av一区| 日韩福利电影在线观看| 亚洲综合网在线观看| 午夜精品福利一区二区三区av| 亚洲av无码乱码国产精品| 久久亚洲精品视频| 国产999精品在线观看| 穿情趣内衣被c到高潮视频| 激情综合色综合久久综合| 99热这里只有精品4| 欧美日韩国产精选| 成人免费看片| 不卡一区二区三区四区五区| 正在播放日韩欧美一页| 人妻巨大乳一二三区| 亚洲国产精品一区二区久久 | 一级黄色片免费看| 日韩一区二区在线视频| 91丨精品丨国产| 日本道在线视频| 成人毛片在线观看| 超碰超碰超碰超碰| 国产亚洲精品美女| 久久av影院| 麻豆视频传媒入口| 顶级嫩模精品视频在线看| 日本少妇裸体做爰| 亚洲美女视频网站| 亚洲精品.com| 91社在线播放| 成人免费高清在线观看| 欧美激情亚洲综合| 夜夜嗨av色一区二区不卡| 色综合一区二区日本韩国亚洲 | 欧美专区一区二区三区| jizz中文字幕| 日韩一区二区三区高清免费看看| 国产激情视频在线| 国产有色视频色综合| 日韩在线观看一区二区| 一级片一级片一级片| 日韩久久精品一区| 极品美女一区| 一区二区三区四区免费观看| proumb性欧美在线观看| 欧美激情一区二区三区免费观看| 久久亚洲精品网站| 精品综合久久88少妇激情| 精品久久久久久久无码| 亚洲精品伦理在线| 国产在线自天天| www日韩av| 日本成人在线不卡视频| 久久免费在线观看视频| 日韩电影免费观看在线观看| av高清一区| 国产主播自拍av| 自拍偷拍国产亚洲| 美州a亚洲一视本频v色道| 91中文精品字幕在线视频| 亚洲影音先锋| 日韩在线观看视频一区二区| 亚洲欧美在线一区二区| 亚洲日本va中文字幕| 成年人观看网站| 一区二区在线观看免费|