青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Dict.CN 在線詞典, 英語(yǔ)學(xué)習(xí), 在線翻譯

學(xué)??嘧髦?,書山勤為徑

留下點(diǎn)回憶

常用鏈接

統(tǒng)計(jì)

積分與排名

Denoise

English study

Web技術(shù)

數(shù)據(jù)壓縮

一些連接

最新評(píng)論

一段代碼優(yōu)化的討論

 優(yōu)化很多時(shí)候是必要的,特別對(duì)于瓶頸程序。這里討論一段代碼的優(yōu)化過(guò)程,從而演示一段簡(jiǎn)單的代碼優(yōu)化過(guò)程,并希望得到一些建議。

先描述一下需求:

一個(gè)16位數(shù)的序列,將其奇數(shù)位置放到一個(gè)序列,偶數(shù)問(wèn)題放到另外一個(gè)序列。注意奇數(shù)和偶數(shù)序列的長(zhǎng)度不一定相同。

最簡(jiǎn)單的代碼:

 

 1void CTestClass::SplitToEvenOddSeqs(short *sp,short *dp1,short *dp2,int evenLen,int oddLen)
 2
 3{
 4
 5            int i;
 6
 7            for(i = 0;i<oddLen;i++,sp+=2,dp1++,dp2++)
 8
 9            {
10
11                        dp1[0= sp[0];
12
13                        dp2[0= sp[1];
14
15            }

16
17            if(i != evenLen)
18
19                        dp1[0= sp[0];
20
21}

22
23

這段代碼可以達(dá)到必要的功能,但他肯定不是優(yōu)化的。

1.循環(huán)中,每次需要訪問(wèn)5個(gè)變量。

2.每次循環(huán)需要一個(gè)判斷,4個(gè)加法

3.最后的不等式判斷也

考慮到dp1dp2總是同時(shí)訪問(wèn),于是定義一個(gè)結(jié)構(gòu)體:

 

typedef struct tagDstData

{

            
short dp1;

            
short dp2;

}
TagDstData;

現(xiàn)在的算法為:

 

void CTestClass::SplitToEvenOddSeqs(short *sp,TagDstData *dp,int evenLen,int oddLen)

{

            
int i;

            
for(i = 0;i<oddLen;i++,sp+=2,dp++){

                        dp
->dp1 = sp[0];

                        dp
->dp2 = sp[1];

            }


            
if(i < evenLen)

                        dp
->dp1 = sp[0];

}


這樣做以后CPU每次讀取dp只需要一次。循環(huán)條件少了一次加法。

上面代碼每次復(fù)制一個(gè)16bit的值,總共四個(gè)字節(jié)要復(fù)制兩次,考慮把這個(gè)地方優(yōu)化一下。優(yōu)化后的代碼如下:

 

void CTestClass::SplitToEvenOddSeqs2(short *sp,TagDstData *dp,int evenLen,int oddLen)

{

            
long *lSp = (long *)sp;

            
long *spEnd = (long *)(sp + (oddLen<<1));

            
long *lDp = (long *)dp;

            

            
while(lSp < spEnd){

                        
*lDp++ = *lSp++;

            }


            
if(oddLen < evenLen)

                        dp[evenLen].dp1 
= *((short *)lSp);

}


這里先不考慮字節(jié)序的問(wèn)題。

這樣優(yōu)化后和前面比較起來(lái)有那些改進(jìn)?

1.循環(huán)體內(nèi)只有一個(gè)指令;對(duì)于++運(yùn)算,很多處理器都能很好處理。

2.循環(huán)條件檢查只有一條比較指令

其實(shí)這里的檢查的比較指令還可以優(yōu)化一下,因?yàn)楸容^指令比較長(zhǎng),看一下下面的改進(jìn):

反正是四個(gè)字節(jié)的復(fù)制,不如下計(jì)算好復(fù)制的4個(gè)字節(jié)數(shù)量;再循環(huán)。

void CTestClass::SplitToEvenOddSeqs3(short *sp,TagDstData *dp,int evenLen,int oddLen)

{

            
long *lSp = (long *)sp;

            
long *spEnd = (long *)(sp + (oddLen<<1));

            
long *lDp = (long *)dp;

            
long nDWORDs = oddLen>>1;

            

            
while(nDWORDs–){

                        
*lDp++ = *lSp++;

            }


            
if(oddLen - evenLen)

                        dp[evenLen].dp1 
= *((short *)lSp);

}



寫好上面四段代碼,拿VS2005編譯一下發(fā)現(xiàn),測(cè)試代碼如下:

 

void CompareData(TagDstData *spDst,short *pSrcTest)

{

            
for(int i = 0;i<10240;i++)

            
{

                        
//if(spDst[0].dp1 )//if we access spDst here, the time will be longer

                        
if(spDst[0].dp1 > pSrcTest[0]|| spDst[0].dp2 >pSrcTest[1])

                        
{

                                    printf(”
Split arithmetic 
is not right!\n”);

                                    
break;

                        }


                        pSrcTest 
+=2;

            }


                        printf(”
Split arithmetic 
is right!\n”);

}


int _tmain(int argc, _TCHAR* argv[])

{

            
int i,f ;

            
int now;

            CTestClass testClass;

            
short spSrc[20480];     

            
short spDst1[10240];

            
short spDst2[10240];

            TagDstData spDst[
10240];

            
short *pSrcTest = spSrc;

            memset(spSrc,
2,20480<<1);

            memset(spDst1,
0,10240<<1);

            memset(spDst2,
0,10240<<1);

            memset(spDst,
0,20480<<1);

            CStopWatch stop1;

            stop1.Start();

            
for(i = 0;i<100000; i++)

                        testClass.SplitToEvenOddSeqs(spSrc,spDst1,spDst2,
10240,10240);

            now 
= stop1.Now();

            printf(”time2 
=%d\n”,now);

            stop1.Start();

            
for(i = 0;i<100000; i++)

                        testClass.SplitToEvenOddSeqs(spSrc,spDst,
10240,10240);

            now 
= stop1.Now();

            printf(”time3 
=%d\n”,now);

            
for(i=0;i<20480;i++)

                        spSrc[i] 
= i;

            memset(spDst,
0,10240<<1);

            CStopWatch stop2;

            
for(f = 0;f<100000; f++)

                        testClass.SplitToEvenOddSeqs2(spSrc,spDst,
10240,10240);

            now 
= stop2.Now();

            printf(”time4 
=%d\n”,now);

            CompareData(spDst,pSrcTest);

            memset(spDst,
0,10240<<1);

            CStopWatch stop3;

            
for(f = 0;f<100000; f++)

                        testClass.SplitToEvenOddSeqs3(spSrc,spDst,
10240,10240);

            now 
= stop3.Now();

            printf(”time5 
=%d\n”,now);

            CompareData(spDst,pSrcTest);

            
return 0;

}


注:其中CStopWatch是我寫的用來(lái)計(jì)算時(shí)間的類。

如果把CompareData中訪問(wèn)spDst的代碼注釋掉,運(yùn)行的結(jié)果:

Intel® Core™2 CPU 6400 2.13Ghz 1GB

time2 =753945 us

time3 =494852 us

time4 =0 us

time5 =0 us

Intel® Core™2 Duo CPU T7250 @2.00GHz 2.00 GHz 2GB

Time2 = 847431 us

Time3=523269 us

Time4=1 us

Time5 =1 us

Pentium® 4 CPU 2.6 GHz  512MB

Time2 = 613622 us

Time3=616545 us

Time4=1 us

Time5 =1 us

如果使用VC6編譯,各種運(yùn)行結(jié)果如下:

Intel® Core™2 CPU 6400 2.13Ghz 1GB

time2 =2041530 us

time3 =1352753 us

time4 =930849 us

time5 =501492 us

Intel® Core™2 Duo CPU T7250 @2.00GHz 2.00 GHz 2GB

time2 =1878766 ustime3 =1380009 ustime4 =959918 us

time5 =523022 us

Pentium® 4 CPU 2.6 GHz  512MB

time2 =2098438 us

time3 =1855219 us

time4 =1068678 us

time5 =610458 us

再把CompareData還原,在VC2005中編譯,執(zhí)行結(jié)果如下:

Intel® Core™2 CPU 6400 2.13Ghz 1GB

time2 =1007759 us

time3 =1364986 us

time4 =876046 us

time5 =437623 us

Intel® Core™2 Duo CPU T7250 @2.00GHz 2.00 GHz 2GB

time2 =1103970 ustime3 =1403941 ustime4 =630279 ustime5 =313330 us 

Pentium® 4 CPU 2.6 GHz  512MB

time2 =1218860 ustime3 =1743361 ustime4 =478785 us

time5 =241885 us

使用VC6重新編譯:

Intel® Core™2 CPU 6400 2.13Ghz 1GB

time2 =2026392 us

time3 =1359155 us

time4 =946604 us

time5 =511307 us

Intel® Core™2 Duo CPU T7250 @2.00GHz 2.00 GHz 2GB

time2 =1921379 ustime3 =1410035 ustime4 =967616 ustime5 =528601 us 

Pentium® 4 CPU 2.6 GHz  512MB

time2 =2089173 ustime3 =1849719 ustime4 =1062956 ustime5 =610357 us 

當(dāng)然這里有重復(fù)運(yùn)算對(duì)算法的運(yùn)行時(shí)間的影響;但考慮所有的算法都是對(duì)同樣的內(nèi)存操作,不考慮。那么我們發(fā)現(xiàn)的就是算法的效率提高是明顯的。算法運(yùn)行時(shí)間縮短為原來(lái)的1/31/4 

另外有幾個(gè)問(wèn)題需要在這里討論一下:

1.演示了時(shí)間問(wèn)題的同時(shí),還看到一個(gè)奇怪的問(wèn)題就是如果注釋了CompareData,在VC2005上得到的后面兩個(gè)算法的時(shí)間幾乎為0。為什么?而VC6的編譯沒有這樣的現(xiàn)象?

2.VC6上編譯得到的結(jié)果與VC2005編譯得到的結(jié)果相比,VC2005結(jié)果更好,為什么?(這個(gè)很弱智了)

3.我覺得程序還可以再優(yōu)化,怎么樣做?

歡迎大家就這個(gè)簡(jiǎn)單的優(yōu)化問(wèn)題,提出討論。

posted on 2007-12-07 06:11 笨笨 閱讀(2490) 評(píng)論(19)  編輯 收藏 引用 所屬分類: 編碼

評(píng)論

# re: 一段代碼優(yōu)化的討論[未登錄] 2007-12-07 08:28 cppexplore

根本原因要看編譯器 優(yōu)化 后的匯編代碼
重構(gòu)代碼的出發(fā)點(diǎn)是可讀性 可維護(hù)性 不是優(yōu)化
系統(tǒng)性能依賴于設(shè)計(jì)階段 之后就是關(guān)鍵算法 性能工具檢測(cè)的性能瓶頸處了  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 08:43 搞笑

搞笑,樓主連一點(diǎn)cache優(yōu)化的意識(shí)都沒有,卻在加幾次上面死磕,看來(lái)又是一個(gè)工作了3-4年的落伍人士,呵呵。  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 09:08 笨笨

@搞笑
說(shuō)的很好!看來(lái)你沒有把文章看完。  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 09:10 笨笨

@cppexplore
你的出發(fā)點(diǎn)我很贊同,就是算法的優(yōu)劣比優(yōu)化要好前百倍。
我這里的例子你也看到了,是一個(gè)非常簡(jiǎn)單的問(wèn)題,好比memcpy或strcpy
所以這里算法的改進(jìn),以我的笨眼來(lái)看,應(yīng)該沒有什么余地了。
這里只是討論一點(diǎn)優(yōu)化的知識(shí);我首先告訴大家,我是初學(xué)這個(gè)方面的人。  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 09:16 笨笨

我希望大家能夠給出一些真正的意見和想法,或者是代碼來(lái)讓這段代碼運(yùn)行的更快。這也是我的發(fā)這個(gè)貼的目的。

也希望大家可以了解到有的應(yīng)該可以跑的比我們想像的快。
我不想得到一些無(wú)聊的建議或話。
謝謝!  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 09:17 LouixG

你應(yīng)該看看自己優(yōu)化代碼的匯編,你在文中說(shuō)了一些讀和寫的計(jì)數(shù),不知你是否是看了匯編后得出的結(jié)論。不同的編譯器優(yōu)化的結(jié)果也不一樣,你用Intel的編譯器試試,效果應(yīng)該會(huì)更好。
我想到一些優(yōu)化辦法:
1,循環(huán)展開;
2,多線程;//這兩個(gè)是高級(jí)語(yǔ)言代碼優(yōu)化,下面是面向特定機(jī)器的指令優(yōu)化。
3,利用更強(qiáng)的單指令數(shù)據(jù)操縱能力:如果目標(biāo)機(jī)器是32位,可以用浮點(diǎn)指令fld和fstp裝載64位數(shù)據(jù);如果目標(biāo)機(jī)器是64位的那么可以直接使用64位寄存器;
4,利用SSE指令,SSE指令集對(duì)應(yīng)的寄存器提供最多128位數(shù)據(jù)寬度;
5,如果你的目標(biāo)機(jī)器不是兼容機(jī)而是PowerPC、SPARC或者嵌入式的架構(gòu),那推薦你查閱對(duì)應(yīng)的CPU手冊(cè),在指令層次上尋找突破。

  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 09:50 笨笨

@LouixG
謝謝。應(yīng)該看出來(lái)是這方面的高手,希望多指點(diǎn)。
想得到一點(diǎn)建議就是:程序性能優(yōu)化如何才能入門?  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 11:46 夢(mèng)在天涯

看了大家的回復(fù),深有感觸啊,

非常高興可以看到C++ Blog這里聚集了越來(lái)越多的高手!

  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論[未登錄] 2007-12-07 12:35 cppexplore

@搞笑
這樣說(shuō)就不對(duì)了 文章寫出來(lái) 大家share下 目的是互補(bǔ)長(zhǎng)短 互相交流 互相進(jìn)步
@笨笨
從本文中例子來(lái)說(shuō) 這種“優(yōu)化”,可讀性更好,更好維護(hù)。的確是正確的。這種差異不是算法的造成的,是開始設(shè)計(jì)的不合理。另,我的建議真的不是無(wú)聊的建議 :)。
@LouixG
(1)展開循環(huán)的點(diǎn)滴性能不是問(wèn)題
(2)多線程模型的目的一般系統(tǒng)設(shè)計(jì)層面的吧,主要是提高系統(tǒng)的吞吐能力,這種問(wèn)題上的性能遠(yuǎn)遠(yuǎn)談不上
(3)后面的問(wèn)題帶來(lái)移植性的問(wèn)題,非底層的關(guān)鍵算法 也不會(huì)有人去做這種優(yōu)化
@夢(mèng)在天涯
blog里的文章真是多啊

@me
廢話真多。。。。。。  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 13:57 LouixG

@cppexplore
每種優(yōu)化可能只提高很小的性能,但為了達(dá)到極致把這些方法綜合就能產(chǎn)生質(zhì)的飛躍。優(yōu)化也分算法優(yōu)化和代碼優(yōu)化,我的想法就是在樓主算法確定的情況下最大可能的優(yōu)化實(shí)現(xiàn)代碼。
提到多線程主要是為了利用多核,但小數(shù)據(jù)量不推薦多線程,提到多核就多說(shuō)點(diǎn),在多核上跑得快的代碼不一定在單核上跑的好,請(qǐng)看代碼:
int * src1 = src;
int * src2 = src + 1;
int * dst1 = dst;
int * dst2 = dst + 1;
while ( ... )
{
*dst1 = *src1;
*dst2 = *src2;
dst1 += 2;
dst2 += 2;
src1 += 2;
src2 += 2;
};
這個(gè)代碼可以肯定在單核上跑得很爛,但是在多核上dst1和dst2被流水線確定為無(wú)關(guān)變量,不相互影響就會(huì)被雙核同時(shí)執(zhí)行,這樣就比單核上跑得快。

在指令層面上思考優(yōu)化不一定帶來(lái)移植性問(wèn)題,例如這段代碼:
double * src_opt = ( ( double * ) src ) - 1;
double * dst_opt = ( ( double * ) dst ) - 1;
int src_ind = 0;
int dst_ind = 0;
int loop_time = ( src_len >> 1 ) + 1;
while ( --loop_time )
{
dst_opt[ ++dst_ind ] = src_opt[ ++src_ind ];
}
Intel編譯器產(chǎn)生的while循環(huán)的匯編:
$B68$3:
add edx, 1
fld QWORD PTR [edi+edx*8-8]
add eax, 1
fstp QWORD PTR [esi+eax*8-8]
add ecx, -1
jne $B68$3
這樣的代碼可以在兼容機(jī)上編譯+運(yùn)行無(wú)阻,且不說(shuō)前兩個(gè)add可被替換inc獲得一定效率提升,我相信這段代碼要比樓主的代碼快。

只有有沒有人做這樣的工作就仁者見仁了,肯定有需要這種工作的時(shí)候。  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 14:22 金慶

怎么會(huì) 0 us? 計(jì)時(shí)有問(wèn)題吧?
time4 =0 us
time5 =0 us

看代碼
printf(”time5 =%d\n”,now);
沒有打印"us". 應(yīng)該保持代碼與結(jié)果的一致.

即然輸出與輸出的內(nèi)存結(jié)構(gòu)一致,直接用memcpy就行了,不必循環(huán)賦值.  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論[未登錄] 2007-12-07 14:55 cppexplore

@LouixG
(1)這個(gè)問(wèn)題不敢妄言,多核下編程重來(lái)沒有接觸過(guò)。不知道這種各個(gè)cpu的分配,是在編譯期間由編譯器完成的,還是在運(yùn)行期間由額外的硬件決定把指令分配給某個(gè)cpu的?這種多核下的編程,值得探討的問(wèn)題就多了,尤其這種在一個(gè)線程內(nèi)的數(shù)據(jù)被分配到多個(gè)cpu,如果真有這種情況,估計(jì)以后會(huì)有語(yǔ)言層面的東西支持。不同線程分配不同的cpu,這個(gè)到還好。
(2)這個(gè)例子的高性能我絲毫不懷疑,通過(guò)字節(jié)對(duì)齊提高性能。其實(shí)標(biāo)準(zhǔn)庫(kù)函數(shù)也是這么做的。不過(guò)這個(gè)例子沒意義啊,直接使用庫(kù)函數(shù)就好。  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 16:22 笨笨

感謝大家的回復(fù)
我沒有說(shuō)cppexplore說(shuō)的是無(wú)聊的啊。

大家說(shuō)的都很好。
我這段代碼只是我自己在隨便看了兩片文章后對(duì)我以前一段代碼進(jìn)行的優(yōu)化;這里面僅僅是用到了幾點(diǎn):
1.合并同時(shí)訪問(wèn)的兩個(gè)數(shù)組
2.使用多字節(jié)復(fù)制
3.替換比較而用減法
4.減少指令的數(shù)目

實(shí)際上我正學(xué)習(xí)這方面的編程,沒有想到這里竟然一下子碰到兩個(gè)高手啊,這么不見你們的BLOG?

另外,我看到一個(gè)比系統(tǒng)的memcpy寫的還要快的內(nèi)存復(fù)制函數(shù),大家不妨看一下:
http://www.vik.cc/daniel/portfolio/memcpy.htm  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 16:24 笨笨

碰到二位強(qiáng)人真是我的幸運(yùn),希望能得到多多指點(diǎn)。  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 17:04 haskell

如果是為優(yōu)化而優(yōu)化,那就管不了那么多了
void haha(short *sp,short *dp1,short *dp2,int count)
{
switch (count % 8) {
case 0: do { *dp1++ = *sp++;
case 7: *dp2++ = *sp++;
case 6: *dp1++ = *sp++;
case 5: *dp2++ = *sp++;
case 4: *dp1++ = *sp++;
case 3: *dp2++ = *sp++;
case 2: *dp1++ = *sp++;
case 1: *dp2++ = *sp++;
} while ((count -= 8) > 0);
}
}
可對(duì)for語(yǔ)句優(yōu)化,看有幫助沒^_^能編譯的  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-07 19:20 空明流轉(zhuǎn)

最近在寫一個(gè)軟件渲染器,流水線還沒通,哪管他優(yōu)不優(yōu)化。。。

大量的std::vector。。。等流水通了把Shader Register改成boost::array,再加上一個(gè)pool應(yīng)該會(huì)快不少吧。反正debug下渲染一個(gè)512 * 512的要好幾秒時(shí)間。。。  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-08 01:39 笨笨

@haskell
你這個(gè)這么多的條件分支,CPU命中率不是很低???  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-08 01:59 haskell

忘了這個(gè)方法叫什么了?
不會(huì)慢的  回復(fù)  更多評(píng)論   

# re: 一段代碼優(yōu)化的討論 2007-12-12 11:14 no name

haskell的方法叫 達(dá)夫設(shè)備Duff's Device,google可找到更多解釋。注意其中每個(gè)case都特意少了break,使用了switch的fall though特性。  回復(fù)  更多評(píng)論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品一区在线| 久久本道综合色狠狠五月| 亚洲激情图片小说视频| 亚洲第一区色| 在线播放日韩| 91久久国产自产拍夜夜嗨| 亚洲破处大片| 99视频精品在线| 亚洲伊人第一页| 久久精品一区二区三区四区| 久久久国际精品| 亚洲第一页在线| 亚洲精品国产拍免费91在线| 亚洲深夜福利在线| 午夜日韩电影| 美女精品一区| 欧美日韩亚洲综合在线| 国产精品亚洲第一区在线暖暖韩国| 国产精品一区二区黑丝| 黄色日韩在线| 亚洲欧美日韩一区二区三区在线观看 | 久久精品国产v日韩v亚洲| 久久在线免费| 欧美日韩人人澡狠狠躁视频| 国产精品推荐精品| 亚洲国产成人av在线| avtt综合网| 麻豆成人在线播放| 亚洲精品一区在线| 久久亚洲色图| 国产精品亚发布| 亚洲日本一区二区三区| 欧美亚洲日本一区| 亚洲精品系列| 玖玖玖国产精品| 国产精品xvideos88| 亚洲大片在线观看| 久久福利资源站| 亚洲国产女人aaa毛片在线| 亚洲欧美久久久久一区二区三区| 欧美韩日一区二区| 国内精品免费午夜毛片| 亚洲欧美激情一区二区| 亚洲国产美女精品久久久久∴| 欧美影视一区| 国产日韩在线看片| 亚洲自拍偷拍福利| 亚洲精品欧美一区二区三区| 老司机久久99久久精品播放免费| 国产女人aaa级久久久级| 一本色道久久| 亚洲国产影院| 欧美高清在线观看| 亚洲国产欧美不卡在线观看| 久久久免费精品| 亚洲欧美另类在线| 国产欧美在线观看一区| 欧美一区二区成人| 午夜精品久久久久久久白皮肤 | 国产视频久久| 久久激情视频免费观看| 亚洲视频碰碰| 国产伦精品一区二区三区在线观看| 亚洲手机在线| 亚洲色图在线视频| 国产精品一区在线播放| 欧美一级理论片| 先锋影音国产精品| 激情综合色丁香一区二区| 久久人人爽国产| 免费观看国产成人| 亚洲精品资源| 欧美亚洲在线播放| 国产喷白浆一区二区三区| 午夜精品视频网站| 欧美永久精品| 在线免费高清一区二区三区| 亚洲风情在线资源站| 欧美福利在线| 亚洲欧美三级伦理| 欧美一级久久久久久久大片| 精品成人久久| 亚洲精品黄色| 国产亚洲欧美一区二区| 裸体素人女欧美日韩| 免费观看一级特黄欧美大片| av成人免费观看| 欧美亚洲一区三区| 亚洲国产欧美一区二区三区久久| 亚洲精品小视频| 国产原创一区二区| 亚洲人成网站777色婷婷| 国产精品女主播一区二区三区| 久久精品国产免费观看| 欧美成年人视频网站| 亚洲女人天堂av| 久久夜色精品国产亚洲aⅴ| 夜夜精品视频| 久久精品国产一区二区三区免费看| 亚洲三级毛片| 性欧美1819sex性高清| 亚洲国产成人一区| 亚洲一区二区三区在线播放| 亚洲国产欧美另类丝袜| 亚洲在线免费| 亚洲乱码国产乱码精品精可以看 | 亚洲综合好骚| 久久婷婷人人澡人人喊人人爽| 一区二区三区鲁丝不卡| 久久精品在这里| 亚洲一区二区三区激情| 久久久噜噜噜| 久久精品国语| 国产精品video| 欧美国产日韩一区二区在线观看| 国产精品热久久久久夜色精品三区| 美女尤物久久精品| 国产日本欧美视频| 亚洲一区二区三区高清| 亚洲视频精品| 欧美激情一区二区三级高清视频| 久久精品国产亚洲精品| 国产精品久久久久久久久久久久久 | 99日韩精品| 最新亚洲电影| 久久青青草综合| 久久精品99无色码中文字幕 | 亚洲日本欧美天堂| 亚洲国产美女| 红桃视频亚洲| 性色一区二区| 久久久91精品国产| 国产乱码精品一区二区三区五月婷 | 欧美午夜精品久久久久免费视 | 亚洲免费小视频| 亚洲无线观看| 欧美日韩 国产精品| 91久久在线视频| 99国产精品视频免费观看| 欧美成人午夜| 亚洲欧洲三级电影| 亚洲欧洲一区二区三区久久| 美玉足脚交一区二区三区图片| 葵司免费一区二区三区四区五区| 韩国三级电影一区二区| 久久精品国产精品| 免费一级欧美片在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 欧美在线观看网站| 久久五月天婷婷| 一区二区三区在线观看视频| 久久久夜夜夜| 欧美国产一区视频在线观看| 91久久精品一区二区三区| 欧美日韩八区| 香蕉av777xxx色综合一区| 另类激情亚洲| 亚洲精品一区二区三区av| 欧美日韩国产在线看| 亚洲一区视频| 免费中文日韩| 一片黄亚洲嫩模| 国产欧美日韩麻豆91| 久久免费国产精品| 亚洲人成久久| 久久久久成人精品| 99精品国产高清一区二区 | 91久久视频| 欧美性猛交视频| 久久国产婷婷国产香蕉| 最近看过的日韩成人| 羞羞视频在线观看欧美| 亚洲激情网站免费观看| 一区二区三区四区五区视频| 亚洲小视频在线| 伊人久久噜噜噜躁狠狠躁| 欧美日韩国产经典色站一区二区三区| 亚洲尤物视频网| 91久久中文字幕| 久久天天躁狠狠躁夜夜爽蜜月| 日韩视频不卡中文| 国产一区二区三区四区老人| 欧美日韩一区二区视频在线 | 亚洲精品免费一二三区| 亚洲欧美日韩成人高清在线一区| 合欧美一区二区三区| 欧美三日本三级三级在线播放| 久久成人18免费观看| 日韩一本二本av| 麻豆精品视频在线| 亚洲一区二区欧美| 亚洲精品一区中文| 一区在线观看视频| 国产九九精品视频| 欧美日韩91| 欧美a级片网| 久久精品日产第一区二区| 亚洲一区二区三区高清不卡| 亚洲国产精品久久91精品| 久久国产欧美|