《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 解決方案 > 簡(jiǎn)明x86匯編語(yǔ)言教程(七)

簡(jiǎn)明x86匯編語(yǔ)言教程(七)

2017-06-10
關(guān)鍵詞: 匯編

5.0 編譯優(yōu)化概述

優(yōu)化是一件非常重要的事情。作為一個(gè)程序設(shè)計(jì)者,你肯定希望自己的程序既小又快。DOS時(shí)代的許多書(shū)中都提到,“某某編譯器能夠生成非常緊湊的代碼”,換言之,編譯器會(huì)為你把代碼盡可能地縮減,如果你能夠正確地使用它提供的功能的話。目前,Intel x86體系上流行的C/C++編譯器,包括Intel C/C++ Compiler, GNU C/C++ Compiler,以及最新的Microsoft和Borland編譯器,都能夠提供非常緊湊的代碼。正確地使用這些編譯器,則可以得到性能足夠好的代碼。

但是,機(jī)器目前還不能像人那樣做富于創(chuàng)造性的事情。因而,有些時(shí)候我們可能會(huì)不得不手工來(lái)做一些事情。

使用匯編語(yǔ)言優(yōu)化代碼是一件困難,而且技巧性很強(qiáng)的工作。很多編譯器能夠生成為處理器進(jìn)行過(guò)特殊優(yōu)化處理的代碼,一旦進(jìn)行修改,這些特殊優(yōu)化可能就會(huì)被破壞而失效。因此,在你決定使用自己的匯編代碼之前,一定要測(cè)試一下,到底是編譯器生成的那段代碼更好,還是你的更好。

本章中將討論一些編譯器在某些時(shí)候會(huì)做的事情(從某種意義上說(shuō),本章內(nèi)容更像是計(jì)算機(jī)專(zhuān)業(yè)的基礎(chǔ)課中《編譯程序設(shè)計(jì)原理》、《計(jì)算機(jī)組成原理》、《計(jì)算機(jī)體系結(jié)構(gòu)》課程中的相關(guān)內(nèi)容)。本章的許多內(nèi)容和匯編語(yǔ)言程序設(shè)計(jì)本身關(guān)系并不是很緊密,它們多數(shù)是在為使用匯編語(yǔ)言進(jìn)行優(yōu)化做準(zhǔn)備。編譯器確實(shí)做這些優(yōu)化,但它并不總是這么做;此外,就編譯器的設(shè)計(jì)本質(zhì)來(lái)說(shuō),它確實(shí)沒(méi)有義務(wù)這么做——編譯器做的是等義變換,而不是等效變換??紤]下面的代碼:

// 程序段1
int gaussianSum(){
 int i, j=0;

for(i=0; i<100; i++) j+=i;

return j;
}

   


好的,首先,絕大多數(shù)編譯器恐怕不會(huì)自作主張地把它“篡改”為

// 程序段1(改進(jìn)1)
int gaussianSum(){
 int i, j=0;

for(i=1; i<100; i++) j+=i;

return j;
}

   


多數(shù)(但確實(shí)不是全部)編譯器也不會(huì)把它改為


// 程序段1(改進(jìn)2)
inline int gaussianSum(){
 return 5050;
}

   


這兩個(gè)修改版本都不同于原先程序的語(yǔ)義。首先我們看到,讓i從0開(kāi)始是沒(méi)有必要的,因?yàn)閖+=i時(shí),i=0不會(huì)做任何有用的事情;然后是,實(shí)際上沒(méi)有必要每一次都計(jì)算1+...+100的和——它可以被預(yù)先計(jì)算,并在需要的時(shí)候返回。

這個(gè)例子也許并不恰當(dāng)(估計(jì)沒(méi)人會(huì)寫(xiě)出最初版本那樣的代碼),但這種實(shí)踐在程序設(shè)計(jì)中確實(shí)可能出現(xiàn)。我們把改進(jìn)2稱(chēng)為編譯時(shí)表達(dá)式預(yù)先計(jì)算,而把改進(jìn)1成為循環(huán)強(qiáng)度削減。

然而,一些新的編譯器的確會(huì)進(jìn)行這兩種優(yōu)化。不過(guò)別慌,看看下面的代碼:

// 程序段2
int GetFactorial(int k){
 int i, j=1;

if((k<0) || (k>=10)) return -1;

if((k<=1)) return 1

for(i=1; i<k; i++) j*=i;

return j;
}

   


程序采用的是一個(gè)時(shí)間復(fù)雜度為O(n)的算法,不過(guò),我們可以把他輕易地改為O(1)的算法:

// 程序段2 (非規(guī)范改進(jìn))
int GetFactorial(int k){
 int i, j=1;

static const int FractorialTable[]={1, 1, 2, 6, 24,
  120, 720, 5040, 40320, 362880, 3628800};

if((k<0) || (k>=10)) return -1;

return FractorialTable[k];
}

   


這是一個(gè)典型的以空間換時(shí)間的做法。通用的編譯器不會(huì)這么做——因?yàn)樗鼪](méi)有辦法在編譯時(shí)確定你是不是要這么改??梢哉f(shuō),如果編譯器真的這樣做的話,那將是一件可怕的事情,因?yàn)槟菚r(shí)候你將很難知道編譯器生成的代碼和自己想的到底有多大的差距。

當(dāng)然,這類(lèi)優(yōu)化超出了本文的范圍——基本上,我把它們歸入“算法優(yōu)化”,而不是“程序優(yōu)化”一類(lèi)。類(lèi)似的優(yōu)化過(guò)程需要程序設(shè)計(jì)人員對(duì)于程序邏輯非常深入地了解和全盤(pán)的掌握,同時(shí),也需要有豐富的算法知識(shí)。

自然,如果你希望自己的程序性能有大幅度的提升,那么首先應(yīng)該做的是算法優(yōu)化。例如,把一個(gè)O(n2)的算法替換為一個(gè)O(n)的算法,則程序的性能提升將遠(yuǎn)遠(yuǎn)超過(guò)對(duì)于個(gè)別語(yǔ)句的修改。此外,一個(gè)已經(jīng)改寫(xiě)為匯編語(yǔ)言的程序,如果要再在算法上作大幅度的修改,其工作量將和重寫(xiě)相當(dāng)。因此,在決定使用匯編語(yǔ)言進(jìn)行優(yōu)化之前,必須首先考慮算法優(yōu)化。但假如已經(jīng)是最優(yōu)的算法,程序運(yùn)行速度還是不夠快怎么辦呢?

好的,現(xiàn)在,假定你已經(jīng)使用了已知最好的算法,決定把它交給編譯器,讓我們來(lái)看看編譯器會(huì)為我們做什么,以及我們是否有機(jī)會(huì)插手此事,做得更好。

5.1 循環(huán)優(yōu)化:強(qiáng)度削減和代碼外提

比較新的編譯器在編譯時(shí)會(huì)自動(dòng)把下面的代碼:

for(i=0; i<10; i++){
 j = i;
 k = j + i;
}    

至少變換為

for(i=0; i<10; i++);
j=i; k=j+i;    

甚至

j=i=10; k=20;    

當(dāng)然,真正的編譯器實(shí)際上是在中間代碼層次作這件事情。

原理 如果數(shù)據(jù)項(xiàng)的某個(gè)中間值(程序執(zhí)行過(guò)程中的計(jì)算結(jié)果)在使用之前被另一中間值覆蓋,則相關(guān)計(jì)算不必進(jìn)行。

也許有人會(huì)問(wèn),編譯器不是都給咱們做了嗎,管它做什么?注意,這里說(shuō)的只是編譯系統(tǒng)中優(yōu)化部分的基本設(shè)計(jì)。不僅在從源代碼到中間代碼的過(guò)程中存在優(yōu)化問(wèn)題,而且編譯器生成的最終的機(jī)器語(yǔ)言(匯編)代碼同樣存在類(lèi)似的問(wèn)題。目前,幾乎所有的編譯器在最終生成代碼的過(guò)程中都有或多或少的瑕疵,這些瑕疵目前只能依靠手工修改代碼來(lái)解決。

5.2 局部?jī)?yōu)化:表達(dá)式預(yù)計(jì)算和子表達(dá)式提取

表達(dá)式預(yù)先計(jì)算非常簡(jiǎn)單,就是在編譯時(shí)盡可能地計(jì)算程序中需要計(jì)算的東西。例如,你可以毫不猶豫地寫(xiě)出下面的代碼:

const unsigned long nGiga = 1024L * 1024L * 1024L;    

而不必?fù)?dān)心程序每次執(zhí)行這個(gè)語(yǔ)句時(shí)作兩遍乘法,因?yàn)榫幾g器會(huì)自動(dòng)地把它改為

const unsigned long nGiga = 1073741824L;    

而不是傻乎乎地讓計(jì)算機(jī)在執(zhí)行到這個(gè)初始化賦值語(yǔ)句的時(shí)候才計(jì)算。當(dāng)然,如果你愿意在上面的代碼中摻上一些變量的話,編譯器同樣會(huì)把常數(shù)部分先行計(jì)算,并拿到結(jié)果。

表達(dá)式預(yù)計(jì)算并不會(huì)讓程序性能有飛躍性的提升,但確實(shí)減少了運(yùn)行時(shí)的計(jì)算強(qiáng)度。除此之外,絕大多數(shù)編譯器會(huì)把下面的代碼:

// [假設(shè)此時(shí)b, c, d, e, f, g, h都有一個(gè)確定的非零整數(shù)值,并且,
// a[]為一個(gè)包括5個(gè)整數(shù)元素的數(shù)組,其下標(biāo)為0到4]

a[0] = b*c;
a[1] = b+c;
a[2] = d*e;
a[3] = b*d + c*d;
a[4] = b*d*e + c*d*e;

   


優(yōu)化為(再次強(qiáng)調(diào),編譯器實(shí)際上是在中間代碼的層次,而不是源代碼層次做這件事情!):

// [假設(shè)此時(shí)b, c, d, e, f, g, h都有一個(gè)確定的非零整數(shù)值,并且,
// a[]為一個(gè)包括5個(gè)整數(shù)元素的數(shù)組,其下標(biāo)為0到4]

a[0] = b*c;
a[1] = b+c;
a[2] = d*e;
a[3] = a[1] * d;
a[4] = a[3] * e;

   


更進(jìn)一步,在實(shí)際代碼生成過(guò)程中,一些編譯器還會(huì)對(duì)上述語(yǔ)句的次序進(jìn)行調(diào)整,以使其運(yùn)行效率更高。例如,將語(yǔ)句調(diào)整為下面的次序:

// [假設(shè)此時(shí)b, c, d, e, f, g, h都有一個(gè)確定的非零整數(shù)值,并且,
// a[]為一個(gè)包括5個(gè)整數(shù)元素的數(shù)組,其下標(biāo)為0到4]

a[0] = b*c;
a[1] = b+c;
a[3] = a[1] * d;
a[4] = a[3] * e;
a[2] = d*e;

   


在某些體系結(jié)構(gòu)中,剛剛計(jì)算完的a[1]可以放到寄存器中,以提高實(shí)際的計(jì)算性能。上述5個(gè)計(jì)算任務(wù)之間,只有1, 3, 4三個(gè)計(jì)算任務(wù)必須串行地執(zhí)行,因此,在新的處理器上,這樣做甚至能夠提高程序的并行度,從而使程序效率變得更高。

5.3 全局寄存器優(yōu)化

[待修訂內(nèi)容] 本章中,從這一節(jié)開(kāi)始的所有優(yōu)化都是在微觀層面上的優(yōu)化了。換言之,這些優(yōu)化是不能使用高級(jí)語(yǔ)言中的對(duì)應(yīng)設(shè)施進(jìn)行解釋的。這一部分內(nèi)容將進(jìn)行較大規(guī)模的修訂。

通常,此類(lèi)優(yōu)化是由編譯器自動(dòng)完成的。我個(gè)人并不推薦真的由人來(lái)完成這些工作——這些工作多半是枯燥而重復(fù)性的,編譯器通常會(huì)比人做得更好(沒(méi)說(shuō)的,肯定也更快)。但話說(shuō)回來(lái),使用匯編語(yǔ)言的程序設(shè)計(jì)人員有責(zé)任了解這些內(nèi)容,因?yàn)橹挥羞@樣才能更好地駕馭處理器。

在前面的幾章中我已經(jīng)提到過(guò),寄存器的速度要比內(nèi)存快。因此,在使用寄存器方面,編譯器一般會(huì)做一種稱(chēng)為全局寄存器優(yōu)化的優(yōu)化。

例如,在我們的程序中使用了4個(gè)變量:i, j, k, l。它們都作為循環(huán)變量使用:

for(i=0; i<1000; i++){
 for(j=0; j<1000; j++){
  for(k=0; k<1000; k++){
   for(l=0; l<1000; l++)
    do_something(i, j, k, l);
  }
 }
}    

這段程序的優(yōu)化就不那么簡(jiǎn)單了。顯然,按照通常的壓棧方法,i, j, k, l應(yīng)該按照某個(gè)順序被壓進(jìn)堆棧,然后調(diào)用do_something(),然后函數(shù)做了一些事情之后返回。問(wèn)題在于,無(wú)論如何壓棧,這些東西大概都得進(jìn)內(nèi)存(不可否認(rèn)某些機(jī)器可以用CPU的Cache做這件事情,但Cache是寫(xiě)通式的和回寫(xiě)式的又會(huì)造成一些性能上的差異)。

聰明的讀者馬上就會(huì)指出,我們不是可以在定義do_something()的時(shí)候加上inline修飾符,讓它在本地展開(kāi)嗎?沒(méi)錯(cuò),本地展開(kāi)以增加代碼量為代價(jià)換取性能,但這只是問(wèn)題的一半。編譯器盡管完成了本地展開(kāi),但它仍然需要做許多額外的工作。因?yàn)榧拇嫫髦挥心敲从邢薜膸讉€(gè),而我們卻有這么多的循環(huán)變量。

把四個(gè)變量按照它們?cè)谘h(huán)中使用的頻率排序,并決定在do_something()塊中的優(yōu)先順序(放入寄存器中的優(yōu)先順序)是一個(gè)解決方案。很明顯,我們可以按照l(shuí), k, j, i的順序(從高到低,因?yàn)閘將被進(jìn)行1000*1000*1000*1000次運(yùn)算!)來(lái)排列,但在實(shí)際的問(wèn)題中,事情往往沒(méi)有這么簡(jiǎn)單,因?yàn)槟悴恢纃o_something()中做的到底是什么。而且,憑什么就以for(l=0; l<1000; l++)作為優(yōu)化的分界點(diǎn)呢?如果do_something()中還有循環(huán)怎么辦?

如此復(fù)雜的計(jì)算問(wèn)題交給計(jì)算機(jī)來(lái)做通常會(huì)有比較滿意的結(jié)果。一般說(shuō)來(lái),編譯器能夠?qū)Τ绦蛑凶兞康氖褂眠M(jìn)行更全面地估計(jì),因此,它分配寄存器的結(jié)果有時(shí)雖然讓人費(fèi)解,但卻是最優(yōu)的(因?yàn)橛?jì)算機(jī)能夠進(jìn)行大量的重復(fù)計(jì)算,并找到最好的方法;而人做這件事相對(duì)來(lái)講比較困難)。

編譯器在許多時(shí)候能夠作出相當(dāng)讓人滿意的結(jié)果。考慮以下的代碼:

int a=0;

for(int i=1; i<10; i++)
 for(int j=1; j<100; j++){
  a += (i*j);
 }

   


讓我們把它變?yōu)槟撤N形式的中間代碼:

00: 0 -> a
01: 1 -> i
02: 1 -> j
03: i*j -> t
04: a+t -> a
05: j+1 -> j
06: evaluate j < 100
07: TRUE? goto 03
08: i+1 -> i
09: evaluate i < 10
10: TRUE? goto 02
11: [繼續(xù)執(zhí)行程序的其余部分]    

程序中執(zhí)行強(qiáng)度最大的無(wú)疑是03到05這一段,涉及的需要寫(xiě)入的變量包括a, j;需要讀出的變量是i。不過(guò),最終的編譯結(jié)果大大出乎我們的意料。下面是某種優(yōu)化模式下Visual C++ 6.0編譯器生成的代碼(我做了一些修改):

xor eax, eax        ; a=0(eax: a)
mov edx, 1         ; i=1(edx: i)
push esi          ; 保存esi(最后要恢復(fù),esi作為代替j的那個(gè)循環(huán)變量)
nexti:
mov ecx, edx        ; [t=i]
mov esi, 999        ; esi=999: 此處修改了原程序的語(yǔ)義,但仍為1000次循環(huán)。
nextj:
add eax, ecx        ; [a+=t]
add ecx, edx        ; [t+=i]
dec esi          ; j--
jne SHORT nextj      ; jne 等價(jià)于 jnz. [如果還需要,則再次循環(huán)]
inc edx          ; i++
cmp edx, 10         ; i與10比較
jl SHORT nexti       ; i < 10, 再次循環(huán)
pop esi          ; 恢復(fù)esi    

這段代碼可能有些令人費(fèi)解。主要是因?yàn)樗粌H使用了大量寄存器,而且還包括了5.2節(jié)中曾提到的子表達(dá)式提取技術(shù)。表面上看,多引入的那個(gè)變量(t)增加了計(jì)算時(shí)間,但要注意,這個(gè)t不僅不會(huì)降低程序的執(zhí)行效率,相反還會(huì)讓它變得更快!因?yàn)橥瑯拥玫搅擞?jì)算結(jié)果(本質(zhì)上,i*j即是第j次累加i的值),但這個(gè)結(jié)果不僅用到了上次運(yùn)算的結(jié)果,而且還省去了乘法(很顯然計(jì)算機(jī)計(jì)算加法要比計(jì)算乘法快)。

這里可能會(huì)有人問(wèn),為什么要從999循環(huán)到0,而不是按照程序中寫(xiě)的那樣從0循環(huán)到999呢?這個(gè)問(wèn)題和匯編語(yǔ)言中的取址有關(guān)。在下兩節(jié)中我將提到這方面的內(nèi)容。

5.4 x86體系結(jié)構(gòu)上的并行最大化和指令封包

考慮這樣的問(wèn)題,我和兩個(gè)同伴現(xiàn)在在山里,遠(yuǎn)處有一口井,我們帶著一口鍋,身邊是樹(shù)林;身上的飲用水已經(jīng)喝光了,此處允許砍柴和使用明火(當(dāng)然我們不想引起火災(zāi):),需要燒一鍋水,應(yīng)該怎么樣呢?

一種方案是,三個(gè)人一起搭灶,一起砍柴,一起打水,一起把水燒開(kāi)。

另一種方案是,一個(gè)人搭灶,此時(shí)另一個(gè)人去砍柴,第三個(gè)人打水,然后把水燒開(kāi)。

這兩種方案畫(huà)出圖來(lái)是這樣:


僅僅這樣很難說(shuō)明兩個(gè)方案孰優(yōu)孰劣,因?yàn)槲覀儾⒉幻鞔_三個(gè)人一起打水、一起砍柴、一起搭灶的效率更高,還是分別作效率更高(通常的想法,一起做也許效率會(huì)更高)。但假如說(shuō),三個(gè)人一個(gè)只會(huì)搭灶,一個(gè)只會(huì)砍柴,一個(gè)只會(huì)打水(當(dāng)然是說(shuō)這三件事情),那么,方案2的效率就會(huì)搞一些了。

在現(xiàn)實(shí)生活中,某個(gè)人擁有專(zhuān)長(zhǎng)是比較普遍的情況;在設(shè)計(jì)計(jì)算機(jī)硬件的時(shí)候則更是如此。你不可能指望加法器不做任何改動(dòng)就能去做移位甚至整數(shù)乘法,然而我們注意到,串行執(zhí)行的程序不可能在同一時(shí)刻同時(shí)用到處理器的所有功能,因此,我們(很自然地)會(huì)希望有一些指令并行地執(zhí)行,以充分利用CPU的計(jì)算資源。

CPU執(zhí)行一條指令的過(guò)程基本上可以分為下面幾個(gè)階段:取指令、取數(shù)據(jù)、計(jì)算、保存數(shù)據(jù)。假設(shè)這4個(gè)階段各需要1個(gè)時(shí)鐘周期,那么,只要資源夠用,并且4條指令之間不存在串行關(guān)系(換言之這些指令的執(zhí)行先后次序不影響最終結(jié)果,或者,更嚴(yán)格地說(shuō),沒(méi)有任何一條指令依賴其他指令的運(yùn)算結(jié)果)指令也可以像下面這樣執(zhí)行:

指令1    取指令    取數(shù)據(jù)    計(jì) 算    存數(shù)據(jù)    

指令2    取指令    取數(shù)據(jù)    計(jì) 算    存數(shù)據(jù)    

指令3    取指令    取數(shù)據(jù)    計(jì) 算    存數(shù)據(jù)    

指令4    取指令    取數(shù)據(jù)    計(jì) 算    存數(shù)據(jù)    

這樣,原本需要16個(gè)時(shí)鐘周期才能夠完成的任務(wù)就可以在7個(gè)時(shí)鐘周期內(nèi)完成,時(shí)間縮短了一半還多。如果考慮灰色的那些方格(這些方格可以被4條指令以外的其他指令使用,只要沒(méi)有串行關(guān)系或沖突),那么,如此執(zhí)行對(duì)于性能的提升將是相當(dāng)可觀的(此時(shí),CPU的所有部件都得到了充分利用)。

當(dāng)然,作為程序來(lái)說(shuō),真正做到這樣是相當(dāng)理想化的情況。實(shí)際的程序中很難做到徹底的并行化。假設(shè)CPU能夠支持4條指令同時(shí)執(zhí)行,并且,每條指令都是等周期長(zhǎng)度的4周期指令,那么,程序需要保證同一時(shí)刻先后發(fā)射的4條指令都能夠并行執(zhí)行,相互之間沒(méi)有關(guān)聯(lián),這通常是不太可能的。

最新的Intel Pentium 4-XEON處理器,以及Intel Northwood Pentium 4都提供了一種被稱(chēng)為超線程(Hyper-Threading TM)的技術(shù)。該技術(shù)通過(guò)在一個(gè)處理器中封裝兩組執(zhí)行機(jī)構(gòu)來(lái)提高指令并行度,并依靠操作系統(tǒng)的調(diào)度來(lái)進(jìn)一步提升系統(tǒng)的整體效率。

由于線程機(jī)制是與操作系統(tǒng)密切相關(guān)的,因此,在本文的這一部分中不可能做更為深入地探討。在后續(xù)的章節(jié)中,我將介紹Win32、FreeBSD 5.x以及Linux中提供的內(nèi)核級(jí)線程機(jī)制(這三種操作系統(tǒng)都支持SMP及超線程技術(shù),并且以線程作為調(diào)度單位)在匯編語(yǔ)言中的使用方法。

關(guān)于線程的討論就此打住,因?yàn)樗嗟匾蕾囉诓僮飨到y(tǒng),并且,無(wú)論如何,操作系統(tǒng)的線程調(diào)度需要更大的開(kāi)銷(xiāo)并且,到目前為止,真正使用支持超線程的CPU,并且使用相應(yīng)操作系統(tǒng)的人是非常少的。因此,我們需要關(guān)心的實(shí)際上還是同一執(zhí)行序列中的并發(fā)執(zhí)行和指令封包。不過(guò),令人遺憾的是,實(shí)際上在這方面編譯器做的幾乎是肯定要比人好,因此,你需要做的只是開(kāi)啟相應(yīng)的優(yōu)化;如果你的編譯器不支持這樣的特性,那么就把它扔掉……據(jù)我所知,目前在Intel平臺(tái)上指令封包方面做的最好的是Intel的C++編譯器,經(jīng)過(guò)Intel編譯器編譯的代碼的性能令人驚異地高,甚至在AMD公司推出的兼容處理器上也是如此。

5.5 存儲(chǔ)優(yōu)化

從前一節(jié)的圖中我們不難看出,方案2中,如果誰(shuí)的動(dòng)作慢,那么他就會(huì)成為性能的瓶頸。實(shí)際上,CPU也不會(huì)像我描述的那樣四平八穩(wěn)地運(yùn)行,指令執(zhí)行的不同階段需要的時(shí)間(時(shí)鐘周期數(shù))是不同的,因此,縮短關(guān)鍵步驟(即,造成瓶頸的那個(gè)步驟)是縮短執(zhí)行時(shí)間的關(guān)鍵。

至少對(duì)于使用Intel系列的CPU來(lái)說(shuō),取數(shù)據(jù)這個(gè)步驟需要消耗比較多的時(shí)間。此外,假如數(shù)據(jù)跨越了某種邊界(如4或8字節(jié),與CPU的字長(zhǎng)有關(guān)),則CPU需要啟動(dòng)兩次甚至更多次數(shù)的讀內(nèi)存操作,這無(wú)疑對(duì)性能構(gòu)成不利影響。

基于這樣的原因,我們可以得到下面的設(shè)計(jì)策略:


程序設(shè)計(jì)中的內(nèi)存數(shù)據(jù)訪問(wèn)策略

盡可能減少對(duì)于內(nèi)存的訪問(wèn)。在不違背這一原則的前提下,如果可能,將數(shù)據(jù)一次處理完。 盡可能將數(shù)據(jù)按4或8字節(jié)對(duì)齊,以利于CPU存取 盡可能一段時(shí)間內(nèi)訪問(wèn)范圍不大的一段內(nèi)存,而不同時(shí)訪問(wèn)大量遠(yuǎn)距離的分散數(shù)據(jù),以利于Cache緩存*    


第一條規(guī)則比較簡(jiǎn)單。例如,需要求一組數(shù)據(jù)中的最大值、最小值、平均數(shù),那么,最好是在一次循環(huán)中做完。

“于是,這家伙又?jǐn)€了一段代碼”……

int a[]={1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0};
int i;
int avg, max, min;

avg=max=min=a[0];

for(i=1; i<(sizeof(a)/sizeof(int)); i++){
 avg+=a[i];
 if(max < a[i])
  max = a[i];
 else if(min > a[i])
  min = a[i];
}

avg /= i;

   


Visual C++編譯器把最開(kāi)始一段賦值語(yǔ)句翻譯成了一段簡(jiǎn)直可以說(shuō)是匪夷所思的代碼:

; int a[]={1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0};
mov edi, 2             ; 此時(shí)edi沒(méi)有意義
mov esi, 3             ; esi也是!臨時(shí)變量而已。
mov DWORD PTR _a$[esp+92], edi
mov edx, 5             ; 黑名單加上edx
mov eax, 7             ; eax也別跑:)
mov DWORD PTR _a$[esp+132], edi
mov ecx, 9             ; 就差你了,ecx
; int i;
; int avg, max, min;
; avg=max=min=a[0];
mov edi, 1             ; edi搖身一變,現(xiàn)在它是min了。
mov DWORD PTR _a$[esp+96], esi
mov DWORD PTR _a$[esp+104], edx
mov DWORD PTR _a$[esp+112], eax
mov DWORD PTR _a$[esp+136], esi
mov DWORD PTR _a$[esp+144], edx
mov DWORD PTR _a$[esp+152], eax
mov DWORD PTR _a$[esp+88], 1    ; 編譯器失誤? 此處edi應(yīng)更好
mov DWORD PTR _a$[esp+100], 4
mov DWORD PTR _a$[esp+108], 6
mov DWORD PTR _a$[esp+116], 8
mov DWORD PTR _a$[esp+120], ecx
mov DWORD PTR _a$[esp+124], 0
mov DWORD PTR _a$[esp+128], 1
mov DWORD PTR _a$[esp+140], 4
mov DWORD PTR _a$[esp+148], 6
mov DWORD PTR _a$[esp+156], 8
mov DWORD PTR _a$[esp+160], ecx
mov DWORD PTR _a$[esp+164], 0
mov edx, edi           ; edx是max。
mov eax, edi           ; 期待已久的avg, 它被指定為eax

這段代碼是最優(yōu)的嗎?我個(gè)人認(rèn)為不是。因?yàn)榫幾g器完全可以在編譯過(guò)程中直接把它們作為常量數(shù)據(jù)放入內(nèi)存。此外,如果預(yù)先對(duì)a[0..9]10個(gè)元素賦值,并利用串操作指令(rep movsdw),速度會(huì)更快一些。

當(dāng)然,犯不上因?yàn)檫@些問(wèn)題責(zé)怪編譯器。要求編譯器知道a[0..9]和[10..19]的內(nèi)容一樣未免過(guò)于苛刻。我們看看下面的指令段:

; for(i=1; ...
mov esi, edi
for_loop:
; avg+=a[i];
mov ecx, DWORD PTR _a$[esp+esi*4+88]
add eax, ecx
; if(max < a[i])
cmp edx, ecx
jge SHORT elseif_min
; max = a[i];
mov edx, ecx
; else if(min > a[i])
jmp SHORT elseif_min
elseif_min:
cmp edi, ecx
jle SHORT elseif_end
; min = a[i];
mov edi, ecx
elseif_end:
; [for i=1]; i<20; i++){
inc esi
cmp esi, 20
jl SHORT for_loop
; }
; avg /= i;
cdq
idiv esi    
; esi: i
; ecx: 暫存變量, =a[i]
; eax: avg
; edx: max
; 有趣的代碼...并不是所有的時(shí)候都有用
; 但是也別隨便刪除
; edi: min
; i++
; i與20比較
; avg /= i    

上面的程序倒是沒(méi)有什么驚人之處。唯一一個(gè)比較嚇人的東西是那個(gè)jmp SHORT指令,它是否有用取決于具體的問(wèn)題。C/C++編譯器有時(shí)會(huì)產(chǎn)生這樣的代碼,我過(guò)去曾經(jīng)錯(cuò)誤地把所有的此類(lèi)指令當(dāng)作沒(méi)用的代碼而刪掉,后來(lái)發(fā)現(xiàn)程序執(zhí)行時(shí)間沒(méi)有明顯的變化。通過(guò)查閱文檔才知道,這類(lèi)指令實(shí)際上是“占位指令”,他們存在的意義在于占據(jù)那個(gè)地方,一來(lái)使其他語(yǔ)句能夠正確地按CPU覺(jué)得舒服的方式對(duì)齊,二來(lái)它可以占據(jù)CPU的某些周期,使得后續(xù)的指令能夠更好地并發(fā)執(zhí)行,避免沖突。另一個(gè)比較常見(jiàn)的、實(shí)現(xiàn)類(lèi)似功能的指令是NOP。

占位指令的去留主要是靠計(jì)時(shí)執(zhí)行來(lái)判斷。由于目前流行的操作系統(tǒng)基本上都是多任務(wù)的,因此會(huì)對(duì)計(jì)時(shí)的精確性有一定影響。如果需要進(jìn)行測(cè)試的話,需要保證以下幾點(diǎn):

計(jì)時(shí)測(cè)試需要注意的問(wèn)題

測(cè)試必須在沒(méi)有額外負(fù)荷的機(jī)器上完成。例如,專(zhuān)門(mén)用于編寫(xiě)和調(diào)試程序的計(jì)算機(jī) 盡量終止計(jì)算機(jī)上運(yùn)行的所有服務(wù),特別是殺毒程序 切斷計(jì)算機(jī)的網(wǎng)絡(luò),這樣網(wǎng)絡(luò)的影響會(huì)消失 將進(jìn)程優(yōu)先級(jí)調(diào)高。對(duì)于Windows系統(tǒng)來(lái)說(shuō),把進(jìn)程(線程)設(shè)置為T(mén)ime-Critical; 對(duì)于*nix系統(tǒng)來(lái)說(shuō),把進(jìn)程設(shè)置為實(shí)時(shí)進(jìn)程 將測(cè)試函數(shù)運(yùn)行盡可能多次運(yùn)行,如10000000次,這樣能夠減少由于進(jìn)城切換而造成的偶然誤差 最后,如果可能的話,把函數(shù)放到單進(jìn)程的系統(tǒng)(例如FreeDOS)中運(yùn)行。

對(duì)于絕大多數(shù)程序來(lái)說(shuō),計(jì)時(shí)測(cè)試是一個(gè)非常重要的東西。我個(gè)人傾向于在進(jìn)行優(yōu)化后進(jìn)行計(jì)時(shí)測(cè)試并比較結(jié)果。目前,我基于經(jīng)驗(yàn)進(jìn)行的優(yōu)化基本上都能夠提高程序的執(zhí)行性能,但我還是不敢過(guò)于自信。優(yōu)化確實(shí)會(huì)提高性能,但人做的和編譯器做的思路不同,有時(shí),我們的確會(huì)做一些費(fèi)力不討好的事情。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 欧日韩无套内射变态 | 日本视频高清一区二区三区 | 天天射天天干天天色 | 日韩人妻无码精品-专区 | 欧美成人一二三区 | 日韩精品久久久肉伦网站 | 人人妻人人藻人人爽欧美一区 | 99久无码中文字幕一本久道 | 国产乱人乱精一区二视频 | 成人aaa片一区国产精品 | 国产精欧美一区二区三区久久 | 国产福利一区二区三区在线观看 | 免费在线观看污网站 | 国产经典自拍 | 欧美日本91精品久久久久 | 青青草自拍偷拍 | 一区视频免费观看 | 玩成熟老熟女视频 | 欧洲成人一区 | 亚洲最新偷拍 | 91精产国品 | 亚洲中文字幕无码av在线 | 欧美成人无尺码免费视频软件 | 日日碰狠狠躁久久躁蜜桃 | 成av人片一区二区三区久久 | 中文乱码人妻系列一区二区 | 欧美日韩中日 | 激情综合网五月婷婷 | 草久在线 | 久久国产色av | 亚洲一二三视频 | xxx一区 | 免费国产裸体美女视频全黄 | 丰满人妻一区二区三区无码av | 久久精品亚洲国产奇米99 | 一区二区三区波多野结衣 | 国产精品久久久久久av | 亚洲欧美日韩国产综合精品二区 | 久久99国产精品久久 | 又大又长粗又爽又黄少妇毛片 | youjizz中国少妇 | 欧美日韩一级二级 | 亚洲一区二区三区无码久久 | 精品一区二区三区蜜桃 | 国产亚洲精品久久久久久打不开 | 免费观看一区二区三区视频 | 91看片网 | 麻豆久久久久久久 | 国产一级黄色影片 | 国产美女裸体无遮挡免费视频 | aa一级视频| 欧美日韩精品网站 | 国产网红主播三级精品视频 | 欧美大片免费观看在线观看网站推荐 | 一级片在线播放 | 中文字幕在线视频播放 | 国产精品自在线拍国产手青青机版 | 国产日韩免费视频 | 国产精品高潮呻吟av久久动漫 | 国产猛烈高潮尖叫视频免费 | 中国国语毛片免费观看视频 | 99热r| 久久亚洲sm情趣捆绑调教 | 激情欧美一区二区三区 | 青青草视频免费观看 | 中文字幕狠狠干 | 特级黄毛片 | 久久免费国产视频 | 五月天婷婷激情网 | 韩国三级hd中文字幕 | 2020无码专区人妻系列日韩 | 91麻豆欧美成人精品 | 国产自偷自拍视频 | 91黑人巨炮vs亚裔美女 | 久久久久麻豆v国产精华液好用吗 | 九色丨9lpony丨大学生 | 无码少妇一区二区 | 91麻豆影院 | 国产四区 | 午夜理论片yy8860y影院 | 国产精品9999久久久久仙踪林 | 一性一交一口添一摸视频 | 国产成人精品777 | 国产乱人偷精品免费视频 | 亚洲色成人网站www永久四虎 | 无码人妻人妻经典 | 黄色片视频免费看 | 免费一区二区三区四区 | 99re在线视频免费观看 | 法国人性生活xxxx | 一本大道加勒比免费视频 | 欧美区一区二 | 日本亚洲精品色婷婷在线影院 | 国产对白videos麻豆高潮 | 欧美一级视频 | 黑人粗硬进入过程视频 | 亚洲精品97久久中文字幕无码 | 中文字幕最新 | 国产成人无码国产亚洲 | 亚洲aⅴ精品一区二区三区91 | www噜噜偷拍在线视频 | 成年人毛片 | 国产黄色小网站 | 一级做a爱片性色毛片 | 免费a级毛片出奶水 | 在线看片人成视频免费无遮挡 | 偷拍自中文字av在线 | 久久99成人免费 | 一卡二卡国产 | 亚洲精品美女久久久 | √天堂资源在线中文最新版 | 香蕉综合在线 | www久久撸撸网 | 国产福利一区在线观看 | 午夜婷婷久久 | 亚洲成a人片77777kkkk1在线观看 | 国产精品爽爽 | 97亚洲熟妇自偷自拍另类图片 | 天天躁夜夜躁狠狠躁2020色戒 | 日韩在线激情视频 | 中文字幕有码无码av | 老鸭窝视频在线观看 | 亚洲欧美一区二区三区孕妇 | 久久99色 | 亚洲精品美女视频 | 北条麻妃在线一区二区韩世雅 | 亚洲美女屁股眼交3 | 人人超人人超碰超国产97超碰 | 黄色免费在线视频 | 国产3p又大又爽又粗又硬免费 | 色哟哟国产精品免费观看 | 在线无码中文字幕一区 | 国内精品久久毛片一区二区 | 日本护士╳╳╳hd少妇 | 91爱爱视频 | 韩国三级hd两男一女 | 日本少妇搡bbbb搡bbb | 男女啪啪进出阳道猛进 | 欧美夫妇交换xxxx | 欧美猛少妇色xxxxx猛叫 | 久久九九热| 亚洲一区二区综合 | 性人久久网av| 国产综合网站 | 古装淫片在线观看 | 亚洲福利av | 日本精品视频一区二区三区四区 | 亚洲人成影院在线无码按摩店 | 欧美视频网站 | 中文字幕在线观看第二页 | 白嫩日本少妇做爰 | 成人免费av影院 | 国产av人人夜夜澡人人爽麻豆 | 国产美女炮机视频 | 亚洲福利在线播放 | av最新资源 | 一区二区三区在线 | 欧 | 久久久久久一区二区 | 99er热精品视频国产 | 免费看国产黄色 | 99视频在线观看视频 | 黄色aa视频 | 污片在线观看 | 天天天色综合a | 欧美黑人性暴力猛交喷水 | 国内自拍一二三四2021 | av毛片在线免费观看 | 无码精品久久久久久人妻中字 | 野战视频aaaaa免费观看 | 国产精品美女www爽爽爽 | 国产在线观看无码免费视频 | 牛牛影视av| 国产尤物精品自在拍视频首页 | 亚洲 欧美 日韩 在线 | 西西午夜 | 性xx无遮挡 | 国内偷拍精品视频 | 国产香港明星裸体xxxx视频 | 国产精品久久久久77777按摩 | 国产毛多水多高潮高清 | 欧美一区二区三区免费播放视频了 | 精品久久人人妻人人做精品 | 三级黄色毛片 | av一级网站 | 亚洲精品乱码久久久久久蜜桃不爽 | 亚洲图片在线视频 | 日韩精品无 | 亚洲人成无码网站在线观看 | 婷婷色国产偷v国产偷v小说 | 又爽又大久久久级淫片毛片 | 美女在线观看av | 成人短视频在线免费观看 | 天天做天天摸天天爽天天爱 | 国产三级精品在线观看 | 欧美一区二区喷水白浆视频 | 伊人夜夜| 肉体裸交137日本大胆摄影 | 男人的天堂中文字幕 | 成人免费三p在线观看 | 欧美极品jizzhd欧美仙踪林 | 草在线视频 | xxxx性视频 | 夜夜躁狠狠躁日日躁2021日韩 | 偷窥自拍青青草 | 日本三级成本人网站 | 国内精品伊人久久久久av影院 | 久久99精品国产.久久久久 | 天堂在线www中文 | 成人男女网24免费 | 成人vr视频专区 | 青娱乐欧美 | 欧美色aⅴ欧美综合色 | 一个人看的www免费视频在线观看 | 欧美麻豆久久久久久中文 | www.香蕉.com| 最新久久精品 | 老司机黄色影院 | 在线观看免费的av | 亚洲最新无码中文字幕久久 | 一级做a爰片 | 欧美激情成人 | 免费国产一级 | 亚洲成人网在线观看 | 色老头在线一区二区三区 | 久久久久毛片 | 大又大粗又爽又黄少妇毛片 | 久久综合伊人一区二区三 | 成人精品毛片 | 69堂成人精品免费视频 | 成人性生生活性生交全黄 | 久久精品久久久久观看99水蜜桃 | 欧美色图俺去了 | 日韩亚洲欧美精品综合 | 国产v片在线播放 | 日本最新免费二区三区 | 麻豆日韩| 国产在线观看www | 国产精品99久久久久宅男软件功能 | 亚洲精品无码午夜福利中文字幕 | 亚洲韩国精品无码一区二区三区 | 极品少妇一区 | 欧美成人手机视频 | 日本欧美亚洲 | 精品国产一区二区三区四区在线 | 先锋av网| 青青青视频免费 | 亚洲精品国产剧情久久9191 | 91美女视频| 国产色站| 四虎国产成人永久精品免费 | 中文人妻熟妇乱又伦精品 | 日韩一级一区 | 婷婷亚洲综合五月天小说 | 美州a亚洲一视本频v色道 | 精品国产免费久久久久久桃子图片 | 国产第99页| 一本一道精品欧美中文字幕 | 91视频色 | 91观看在线 | 中文字幕在线一区二区三区 | 国产毛片久久久 | 日本欧美一区 | 黄色一级片在线免费观看 | 国产永久在线 | 在线成人www免费观看视频 | 国产69av | 黄色大片一区二区三区 | 国产自产c区 | 国产欧美日韩免费 | 亚洲人成综合 | av中文资源在线 | 中文字幕在线观看视频网站 | 免费人妻无码不卡中文字幕系 | 日韩欧美中文字幕在线三区 | 国产免费资源 | 97se综合| 伊人av在线免费观看 | 亚洲国产精品999久久久婷婷 | 国产毛片毛片毛片毛片毛片 | 亚洲精品熟女国产 | 宅男噜噜噜666在线观看 | 天天爽影院一区二区在线影院 | 成人免费观看激情视频 | av一片| 久久久青青草 | 少妇黄色片 | 农村一级毛片 | 国产绿帽口舌视频vk | 久久久久久国产精品免费免费男同 | 精品水蜜桃久久久久久久 | 色综合视频在线 | 香港澳门三级做爰 | 性疯狂做受xxxx高清视频 | 亚洲麻豆91传媒 | 欧美精品欧美精品系列 | 女人精69xxxⅹxx猛交 | 日韩一区免费 | 国模视频一区 | 欧美交换乱淫粗大 | 欧美激情首页 | 日韩黄色免费观看 | 免费观看性生活大片3 | 久久久久九九九九 | 中文字幕精品在线 | 久久久国产亚洲精品 | 免费不卡的av | 久久99网站 | 国产成人精品亚洲午夜麻豆 | 99久久国语露脸精品国产 | 黄色片免费网站 | 国产成人无码18禁午夜福利p | 亚洲精品乱码 | 欧美人妖xxxx | 国外亚洲成av人片在线观看 | 一本一道a∨波多野极衣 | 国产色视频在线观看免费 | 国产男女猛烈无遮挡免费网站 | 青青草狠狠干 | 福利视频免费观看 | 精品久久久久久无码专区不卡 | 丁香在线视频 | 九九在线精品视频 | 亚欧美无遮挡hd高清在线视频 | 蜜桃传媒 | jzzjzzjzz亚洲成孰少妇 | 精品亚洲国产成人av | 国产精品久久久久aaaa九色 | 国产特级黄色录像 | 97视频免费在线观看 | 非洲黑人三级全黄 | 国产又色又爽又刺激在线播放 | 情侣做性视频在线播放 | 国产精品黄在线观看免费软件 | 亚洲欧洲精品在线 | 亚州激情 | 夜夜爽一区二区三区 | 中文精品一区二区三区四区 | 日本人一69式jzzij | 日本久久不卡 | 国内精品久久久久影院优 | 日韩成人av网站 | 无码一区二区三区中文字幕 | 精品国产99久久久久久 | 久久久久久久久久久av | 亚洲第一成人网站 | 国产伦精品一区二区三区无广告 | 日本边添边摸免费视频网站 | 澳门av网站| 四虎成人精品国产永久免费无码 | 精品女同一区二区 | 性色av一区二区三区咪爱四虎 | 国产一级片网址 | 唯美欧美亚洲 | 午夜精品在线播放 | 一色桃子在线精品播放 | 日本美女视频网站 | 国产精品人 | 欧美做受又硬又粗又大视频 | 日本精品一区二区在线观看 | а√中文在线资源库 | 日韩免费在线视频 | 欧美日韩国产精品久久 | 久久综合爱 | 偷窥自拍青青草 | 国产免费网址 | 国产精品视频不卡 | 久久99精品久久久久久噜噜 | 精品一区在线视频 | 俺去俺来也www色官网cms | 狠狠色噜噜狠狠狠狠米奇7777 | 日本中文字幕一区二区有限公司 | 日韩精品91亚洲二区在线观看 | 日本xxxx在线观看 | 日韩avxxx | 18禁亚洲深夜福利入口 | 国自产拍偷拍福利精品免费一 | 日本一区二区不卡在线观看 | 99久久综合精品五月天 | 日日摸日日干 | 天天射天天干 | 99国产精品久久久 | 九九精品九九 | 少妇高潮露脸国语对白 | 欧美偷窥清纯综合图区 | 邻居少妇张开双腿让我爽一夜图片 | 免费看男女做好爽好硬视频 | 日韩av三级在线观看 | 国产福利一区视频 | 女教师高潮黄又色视频 | avhd101高清在线迷片麻豆 | 国产人妖av| 三及片在线观看 | 一级在线播放 | 国产伦精品一区二区三区视频黑人 | 成人精品在线观看 | 欧美成人精品第一区二区三区 | 国产精品一区二区在线免费观看 | 97视频免费看 | 人妻教师痴汉电车波多野结衣 | 高清不卡一区二区三区 | 国产又粗又大又长 | 日本www一道久久久免费榴莲 | 国产精品熟妇视频国产偷人 | 亚洲人成网站在线在线观看 | 中文字幕2区 | 香港黄色网 | 欧美最猛黑人xxxx | 一区二区三区毛片 | 精品国产va久久久久久久冰 | 在线a亚洲视频播放在线观看 | 少妇又紧又色又爽又刺激视频 | 放荡闺蜜高h苏桃情事h | 亚洲福利视频在线 | 亚洲国产图片 | 狠狠躁18三区二区一区 | 天天色综合1 | k8经典少妇在线观看 | 亚洲激情四射 | 91免费高清视频 | 五月婷六月丁香狠狠躁狠狠爱 | 秋霞特色aa大片 | 亚洲人成亚洲人成在线观看 | 国色天香婷婷综合网 | 日本一丰满一bbw | 国产欧美精品一区二区色综合 | 在线涩涩 | 久草在线免| 国产精品日日做人人爱 | 国产一区二区免费播放 | 国产又爽又黄又刺激的视频 | 九一精品视频 | 国产伦子伦对白在线播放观看 | 久久久久久久性 | 九色在线观看 | 亚韩天堂色总合 | 成人福利视频在线观看 | 中国中文字幕伦av在线看片 | 老女人乱淫 | 狂野欧美性猛交xxxxx视频 | 波多野结衣激情视频 | 大地资源影视在线播放观看高清视频 | 乱人伦中文无码视频在线观看 | 午夜视频在线观看一区二区 | 久热精品在线 | 最新国产福利在线观看精品 | 亚洲精品一品区二品区三品区 | 日韩精品一区不卡 | 亚洲色婷婷六月亚洲婷婷6月 | 一级片大片 | 亚洲无线一二三四区手机 | 亚洲精品午夜久久久 | 免费观看bbb毛片大全 | 91小宝寻花一区二区三区 | 成人午夜sm精品久久久久久久 | 成年性生交大片免费看 | 黄色aaa| 色视频在线网站 | 3d动漫精品啪啪一区二区免费 | 葵司有码中文字幕二三区 | 免费无遮挡无码永久视频 | 日本一级黄色 | 亚洲午夜爱爱香蕉片 | 天天综合天天 | 亚洲丝袜av | 亚洲男女内射在线播放 | 国产91在线免费 | 男女猛烈激情xx00免费视频 | 国产精品尤物 | 国产精品成av人在线视午夜片 | 精品免费看 | 亚洲va欧美va人人爽春色影视 | 无码专区久久综合久中文字幕 | 视频h在线 | 亚洲精品乱码久久观看网 | 日本美脚玉足脚交 | 在线aⅴ亚洲中文字幕 | 日日干夜夜爽 | 久久久久女教师免费一区 | 国产一区亚洲二区三区 | 一级国产航空美女毛片内谢 | 久久九九爱 | 国产一区二区三区四区在线观看 | 亚洲激情视频在线播放 | 日韩少妇高潮抽搐 | 精品国产18久久久久久 | 中文字幕乱码一区av久久不卡 | 日本精品4080yy私人影院 | 岛国av免费观看 | 人人干超碰| 狠狠色丁香久久婷婷综合_中 | 亚洲一级二级 | 性折磨bdsm虐乳欧美激情另类 | 色天堂影院 | 日韩成人综合 | 精品国产91久久久久久久妲己 | 天堂va欧美ⅴa亚洲va一国产 | 欧美孕妇xxxx做受欧美88 | 亚洲人成影院在线观看 | 国产视频一区三区 | 日本精品一区二区三区在线播放视频 | 国产日韩欧美亚洲精品中字 | 精品无码人妻一区二区免费蜜桃 | 亚洲成人伊人 | 超碰天天操 | 在线观看成年人网站 | 人妻教师痴汉电车波多野结衣 | 深夜福利免费在线观看 | aa亚洲 | 免费裸体无遮挡黄网站免费看 | wwwcom亚洲 | 中文人妻无码一区二区三区 | 午夜日韩视频 | 欧美黑人xxxⅹ高潮交 | 色伊人网 | 日本精品人妻无码免费大全 | 色婷五月天 | 国产精品久久久久久亚洲色 | 久久久久久久999 | 久久性色| 亚洲国产精品系列 | 午夜在线视频一区二区区别 | 亚洲天堂在线视频播放 | 久久久精品一区二区 | 国产精品大尺度 | 日本乱子人伦在线视频 | 色橹橹欧美在线观看视频高清 | 亚洲国产成人a精品不卡在线 | 亚洲成av人片在线观看无 | 中文在线字幕免 | 亚洲欧美乱日韩乱国产 | 中文字幕亚洲一区二区三区 | 国产男女视频网站 | av手机天堂 | 国产全肉乱妇杂乱视频1 | 婷婷五月综合色视频 | 成人免费毛片视频 | 久久久黄色片 | 国产一区二区三区在线观看视频 | 国产主播av | 国产精品久久久久久久久免费桃花 | 天堂在线视频 | 6080影视最新97理伦片 | 波多野吉衣久久 | 色a在线观看 | 超碰免费在 | 久久小草成人av免费观看 | va欧美| 国产自产视频 | 日本系列 1页 亚洲系列 | 亚洲精品无码专区在线 | 久久精品无码观看tv | 国产偷国产偷亚洲清高动态图 | 一级一级一级毛片 | 中文字幕 亚洲视频 | 免费毛片a线观看 | 日产精品久久久久久久蜜臀 | 久久国内偷拍 | 色屋在线 | 五月综合色 | 欧美专区第二页 | 亚洲精品成人av | 欧美男人亚洲天堂 | 久久精品道一区二区三区 | 九一视频在线 | 国产在线视频福利 | 国产欧美激情视频 | 国产又粗又长又硬免费视频 | 香蕉免费在线视频 | 国产嫩草影院久久久久 | 老妇裸体性激交老太视频 | 亚洲国产精品久久久久秋霞1 | 国产做受高潮69 | 久草在线手机视频 | 99爱99| 国产欧美日韩va另类在线播放 | 亚洲色精品vr一区区三区 | 亚洲精品1区 | 欧美性插b在线视频网站 | 清清草免费视频 | 1313午夜精品理论片 | 精品国产91乱码一区二区三区 | 狠狠v欧美v日韩v亚洲ⅴ | 韩国色综合 | 日韩一区二区三区视频 | 久久伊人色 | 忘忧草在线社区www中国中文 | 国产好爽…又高潮了毛片 | 啪啪网视频 | 日本污污网站 | 久久久久久久久久久免费av | 国产视频手机在线观看 | 日本久久综合 | 69视频在线 | 成人av无码一区二区三区 | wwwyoujizzcom国产 wwwyoujizzcom久久 | 国产精品毛片一区视频播 | 成人免费视频久久 | 欧美日韩精品一区二区三区蜜桃 | 精品人妻一区二区三区浪潮在线 | 国产二区视频在线观看 | 欧美一区二区日韩国产 | 欧美一级特黄aaaaaaa什 | 欧美性生活网站 | 极品探花在线 | 国产欧美日韩精品一区二区三区 | 欧美乱大交xxxxx | 国产熟人av一二三区 | 久久久久久久久嫩草精品乱码 | 久久香视频 | 国产清纯白嫩初高中在线观看性色 | 国产热re99久久6国产精品 | wwwyoujizz日本| 久久精品国产露脸对白 | 天天色综合2 | vvvv99日韩精品亚洲 |