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

測試JavaScript函數(shù)的性能

開發(fā) 前端
在軟件中,性能一直扮演著重要的角色。在Web應(yīng)用中,性能變得更加重要,因為如果頁面速度很慢的話,用戶就會很容易轉(zhuǎn)去訪問我們的競爭對手的網(wǎng)站。作為專業(yè)的web開發(fā)人員,我們必須要考慮這個問題。有很多“古老”的關(guān)于性能優(yōu)化的最佳實踐在今天依然可行,例如最小化請求數(shù)目,使用CDN以及不編寫阻塞頁面渲染的代碼。然而,隨著越來越多的web應(yīng)用都在使用JavaScript,確保我們的代碼運行的很快就變得很重要。

[[199635]]

在軟件中,性能一直扮演著重要的角色。在Web應(yīng)用中,性能變得更加重要,因為如果頁面速度很慢的話,用戶就會很容易轉(zhuǎn)去訪問我們的競爭對手的網(wǎng)站。作為專業(yè)的web開發(fā)人員,我們必須要考慮這個問題。有很多“古老”的關(guān)于性能優(yōu)化的***實踐在今天依然可行,例如最小化請求數(shù)目,使用CDN以及不編寫阻塞頁面渲染的代碼。然而,隨著越來越多的web應(yīng)用都在使用JavaScript,確保我們的代碼運行的很快就變得很重要。

假設(shè)你有一個正在工作的函數(shù),但是你懷疑它運行得沒有期望的那樣快,并且你有一個改善它性能的計劃。那怎么去證明這個假設(shè)呢?在今天,有什么***實踐可以用來測試JavaScript函數(shù)的性能呢?一般來說,完成這個任務(wù)的***方式是使用內(nèi)置的performance.now()函數(shù),來衡量函數(shù)運行前和運行后的時間。

在這篇文章中,我們會討論如何衡量代碼運行時間,以及有哪些技術(shù)可以避免一些常見的“陷阱”。

Performance.now()

高分辨率時間API提供了一個名為now()的函數(shù),它返回一個DOMHighResTimeStamp對象,這是一個浮點數(shù)值,以毫秒級別(精確到千分之一毫秒)顯示當(dāng)前時間。單獨這個數(shù)值并不會為你的分析帶來多少價值,但是兩個這樣的數(shù)值的差值,就可以精確描述過去了多少時間。

這個函數(shù)除了比內(nèi)置的Date對象更加精確以外,它還是“單調(diào)”的,簡單說,這意味著它不會受操作系統(tǒng)(例如,你筆記本上的操作系統(tǒng))周期性修改系統(tǒng)時間影響。更簡單的說,定義兩個Date實例,計算它們的差值,并不代表過去了多少時間。

“單調(diào)性”的數(shù)學(xué)定義是“(一個函數(shù)或者數(shù)值)以從不減少或者從不增加的方式改變”。

我們可以從另外一種途徑來解釋它,即想象使用它來在一年中讓時鐘向前或者向后改變。例如,當(dāng)你所在國家的時鐘都同意略過一個小時,以便***化利用白天的時間。如果你在時鐘修改之前創(chuàng)建了一個Date實例,然后在修改之后創(chuàng)建了另外一個,那么查看這兩個實例的差值,看上去可能像“1小時零3秒又123毫秒”。而使用兩個performance.now()實例,差值會是“3秒又123毫秒456789之一毫秒”。

在這一節(jié)中,我不會涉及這個API的過多細(xì)節(jié)。如果你想學(xué)習(xí)更多相關(guān)知識或查看更多如何使用它的示例,我建議你閱讀這篇文章:Discovering the High Resolution Time API。

既然你知道高分辨率時間API是什么以及如何使用它,那么讓我們繼續(xù)深入看一下它有哪些潛在的缺點。但是在此之前,我們定義一個名為makeHash()的函數(shù),在這篇文章剩余的部分,我們會使用它。

  1. function makeHash(source) { 
  2.  
  3.  var hash = 0; 
  4.  
  5.  if (source.length === 0) return hash; 
  6.  
  7.  for (var i = 0; i < source.length; i++) { 
  8.  
  9.    var char = source.charCodeAt(i); 
  10.  
  11.    hash = ((hash<<5)-hash)+char
  12.  
  13.    hash = hash & hash; // Convert to 32bit integer 
  14.  
  15.  } 
  16.  
  17.  return hash; 
  18.  

 

我們可以通過下面的代碼來衡量這個函數(shù)的執(zhí)行效率:

  1. var t0 = performance.now(); 
  2.  
  3. var result = makeHash('Peter'); 
  4.  
  5. var t1 = performance.now(); 
  6.  
  7. console.log('Took', (t1 - t0).toFixed(4), 'milliseconds to generate:', result); 

 

如果你在瀏覽器中運行這些代碼,你應(yīng)該看到類似下面的輸出:

  1. Took 0.2730 milliseconds to generate: 77005292 

這段代碼的在線演示如下所示:

記住這個示例后,讓我們開始下面的討論。

缺陷1 – 意外衡量不重要的事情

在上面的示例中,你可以注意到,我們在兩次調(diào)用performance.now()中間只調(diào)用了makeHash()函數(shù),然后將它的值賦給result變量。這給我們提供了函數(shù)的執(zhí)行時間,而沒有其他的干擾。我們也可以按照下面的方式來衡量代碼的效率:

  1. var t0 = performance.now(); 
  2.  
  3. console.log(makeHash('Peter')); // bad idea! 
  4.  
  5. var t1 = performance.now(); 
  6.  
  7. console.log('Took', (t1 - t0).toFixed(4), 'milliseconds'); 

 

這個代碼片段的在線演示如下所示:

但是在這種情況下,我們將會測量調(diào)用makeHash(‘Peter’)函數(shù)花費的時間,以及將結(jié)果發(fā)送并打印到控制臺上花費的時間。我們不知道這兩個操作中每個操作具體花費多少時間, 只知道總的時間。而且,發(fā)送和打印輸出的操作所花費的時間會依賴于所用的瀏覽器,甚至依賴于當(dāng)時的上下文。

或許你已經(jīng)***的意識到console.log方式是不可以預(yù)測的。但是執(zhí)行多個函數(shù)同樣是錯誤的,即使每個函數(shù)都不會觸發(fā)I/O操作。例如:

  1. var t0 = performance.now(); 
  2.  
  3. var name = 'Peter'
  4.  
  5. var result = makeHash(name.toLowerCase()).toString(); 
  6.  
  7. var t1 = performance.now(); 
  8.  
  9. console.log('Took', (t1 - t0).toFixed(4), 'milliseconds to generate:', result); 

 

同樣,我們不會知道執(zhí)行時間是怎么分布的。它會是賦值操作、調(diào)用toLowerCase()函數(shù)或者toString()函數(shù)嗎?

缺陷 #2 – 只衡量一次

另外一個常見的錯誤是只衡量一次,然后匯總花費的時間,并以此得出結(jié)論。很可能執(zhí)行不同的次數(shù)會得出完全不同的結(jié)果。執(zhí)行時間依賴于很多因素:

  • 編輯器熱身的時間(例如,將代碼編譯成字節(jié)碼的時間)
  • 主線程可能正忙于其它一些我們沒有意識到的事情
  • 你的電腦的CPU可能正忙于一些會拖慢瀏覽器速度的事情

持續(xù)改進(jìn)的方法是重復(fù)執(zhí)行函數(shù),就像這樣:

  1. var t0 = performance.now(); 
  2.  
  3. for (var i = 0; i < 10; i++) { 
  4.  
  5.  makeHash('Peter'); 
  6.  
  7.  
  8. var t1 = performance.now(); 
  9.  
  10. console.log('Took', ((t1 - t0) / 10).toFixed(4), 'milliseconds to generate'); 

 

這個示例的在線演示如下所示:

這種方法的風(fēng)險在于我們的瀏覽器的JavaScript引擎可能會使用一些優(yōu)化措施,這意味著當(dāng)我們第二次調(diào)用函數(shù)時,如果輸入時相同的,那么JavaScript引擎可能會記住了***次調(diào)用的輸出,然后簡單的返回這個輸出。為了解決這個問題,你可以使用很多不同的輸入字符串,而不用重復(fù)的使用相同的輸入(例如‘Peter’)。顯然,使用不同的輸入進(jìn)行測試帶來的問題就是我們衡量的函數(shù)會花費不同的時間。或許其中一些輸入會花費比其它輸入更長的執(zhí)行時間。

缺陷 #3 – 太依賴平均值

在上一節(jié)中,我們學(xué)習(xí)到的一個很好的實踐是重復(fù)執(zhí)行一些操作,理想情況下使用不同的輸入。然而,我們要記住使用不同的輸入帶來的問題,即某些輸入的執(zhí)行時間可能會花費所有其它輸入的執(zhí)行時間都長。這樣讓我們退一步來使用相同的輸入。假設(shè)我們發(fā)送同樣的輸入十次,每次都打印花費了多長時間。我們會得到像這樣的輸出:

  1. Took 0.2730 milliseconds to generate: 77005292 
  2.  
  3. Took 0.0234 milliseconds to generate: 77005292 
  4.  
  5. Took 0.0200 milliseconds to generate: 77005292 
  6.  
  7. Took 0.0281 milliseconds to generate: 77005292 
  8.  
  9. Took 0.0162 milliseconds to generate: 77005292 
  10.  
  11. Took 0.0245 milliseconds to generate: 77005292 
  12.  
  13. Took 0.0677 milliseconds to generate: 77005292 
  14.  
  15. Took 0.0289 milliseconds to generate: 77005292 
  16.  
  17. Took 0.0240 milliseconds to generate: 77005292 
  18.  
  19. Took 0.0311 milliseconds to generate: 77005292 

 

請注意***次時間和其它九次的時間完全不一樣。這很可能是因為瀏覽器中的JavaScript引擎使用了優(yōu)化措施,需要一些熱身時間。我們基本上沒有辦法避免這種情況,但是會有一些好的補(bǔ)救措施來阻止我們得出一些錯誤的結(jié)論。

一種方式是去計算后面9次的平均時間。另外一種更加使用的方式是收集所有的結(jié)果,然后計算“中位數(shù)”。基本上,它會將所有的結(jié)果排列起來,對結(jié)果進(jìn)行排序,然后取中間的一個值。這是performance.now()函數(shù)如此有用的地方,因為無論你做什么,你都可以得到一個數(shù)值。

讓我們再試一次,這次我們使用中位數(shù)函數(shù):

  1. var numbers = []; 
  2.  
  3. for (var i=0; i < 10; i++) { 
  4.  
  5.  var t0 = performance.now(); 
  6.  
  7.  makeHash('Peter'); 
  8.  
  9.  var t1 = performance.now(); 
  10.  
  11.  numbers.push(t1 - t0); 
  12.  
  13.  
  14.   
  15.  
  16. function median(sequence) { 
  17.  
  18.  sequence.sort();  // note that direction doesn't matter 
  19.  
  20.  return sequence[Math.ceil(sequence.length / 2)]; 
  21.  
  22.  
  23.   
  24.  
  25. console.log('Median time', median(numbers).toFixed(4), 'milliseconds'); 

 

缺陷 #4 – 以可預(yù)測的方式比較函數(shù)

我們已經(jīng)理解衡量一些函數(shù)很多次并取平均值總會是一個好主意。而且,上面的示例告訴我們使用中位數(shù)要比平均值更好。

在實際中,衡量函數(shù)執(zhí)行時間的一個很好的用處是來了解在幾個函數(shù)中,哪個更快。假設(shè)我們有兩個函數(shù),它們的輸入?yún)?shù)類型一致,輸出結(jié)果相同,但是它們的內(nèi)部實現(xiàn)機(jī)制不一樣。

例如,我們希望有一個函數(shù),當(dāng)特定的字符串在一個字符串?dāng)?shù)組中存在時,函數(shù)返回true或者false,但這個函數(shù)在比較字符串時不關(guān)心大小寫。換句話說,我們不能直接使用Array.prototype.indexOf方法,因為這個方法是大小寫敏感的。下面是這個函數(shù)的一個實現(xiàn):

  1. function isIn(haystack, needle) { 
  2.  
  3.  var found = false
  4.  
  5.  haystack.forEach(function(element) { 
  6.  
  7.    if (element.toLowerCase() === needle.toLowerCase()) { 
  8.  
  9.      found = true
  10.  
  11.    } 
  12.  
  13.  }); 
  14.  
  15.  return found; 
  16.  
  17.  
  18.   
  19.  
  20. console.log(isIn(['a','b','c'], 'B'));  // true 
  21.  
  22. console.log(isIn(['a','b','c'], 'd'));  // false 

 

我們可以立刻發(fā)現(xiàn)這個方法有改進(jìn)的地方,因為haystack.forEach循環(huán)總會遍歷所有的元素,即使我們可以很快找到一個匹配的元素。現(xiàn)在讓我們使用for循環(huán)來編寫一個更好的版本。

  1. function isIn(haystack, needle) { 
  2.  
  3.  for (var i = 0, len = haystack.length; i < len; i++) { 
  4.  
  5.    if (haystack[i].toLowerCase() === needle.toLowerCase()) { 
  6.  
  7.      return true
  8.  
  9.    } 
  10.  
  11.  } 
  12.  
  13.  return false
  14.  
  15.  
  16.   
  17.  
  18. console.log(isIn(['a','b','c'], 'B'));  // true 
  19.  
  20. console.log(isIn(['a','b','c'], 'd'));  // false 

 

現(xiàn)在我們來看哪個函數(shù)更快一些。我們可以分別運行每個函數(shù)10次,然后收集所有的測量結(jié)果:

  1. function isIn1(haystack, needle) { 
  2.  
  3.  var found = false
  4.  
  5.  haystack.forEach(function(element) { 
  6.  
  7.    if (element.toLowerCase() === needle.toLowerCase()) { 
  8.  
  9.      found = true
  10.  
  11.    } 
  12.  
  13.  }); 
  14.  
  15.  return found; 
  16.  
  17.  
  18.   
  19.  
  20. function isIn2(haystack, needle) { 
  21.  
  22.  for (var i = 0, len = haystack.length; i < len; i++) { 
  23.  
  24.    if (haystack[i].toLowerCase() === needle.toLowerCase()) { 
  25.  
  26.      return true
  27.  
  28.    } 
  29.  
  30.  } 
  31.  
  32.  return false
  33.  
  34.  
  35.   
  36.  
  37. console.log(isIn1(['a','b','c'], 'B'));  // true 
  38.  
  39. console.log(isIn1(['a','b','c'], 'd'));  // false 
  40.  
  41. console.log(isIn2(['a','b','c'], 'B'));  // true 
  42.  
  43. console.log(isIn2(['a','b','c'], 'd'));  // false 
  44.  
  45.   
  46.  
  47. function median(sequence) { 
  48.  
  49.  sequence.sort();  // note that direction doesn't matter 
  50.  
  51.  return sequence[Math.ceil(sequence.length / 2)]; 
  52.  
  53.  
  54.   
  55.  
  56. function measureFunction(func) { 
  57.  
  58.  var letters = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'.split(','); 
  59.  
  60.  var numbers = []; 
  61.  
  62.  for (var i = 0; i < letters.length; i++) { 
  63.  
  64.    var t0 = performance.now(); 
  65.  
  66.    func(letters, letters[i]); 
  67.  
  68.    var t1 = performance.now(); 
  69.  
  70.    numbers.push(t1 - t0); 
  71.  
  72.  } 
  73.  
  74.  console.log(func.name'took', median(numbers).toFixed(4)); 
  75.  
  76.  
  77.   
  78.  
  79. measureFunction(isIn1); 
  80.  
  81. measureFunction(isIn2); 

 

我們運行上面的代碼, 可以得出如下的輸出:

  1. true 
  2.  
  3. false 
  4.  
  5. true 
  6.  
  7. false 
  8.  
  9. isIn1 took 0.0050 
  10.  
  11. isIn2 took 0.0150 

 

這個示例的在線演示如下所示:

到底發(fā)生了什么?***個函數(shù)的速度要快3倍!那不是我們假設(shè)的情況。

其實假設(shè)很簡單,但是有些微妙。***個函數(shù)使用了haystack.forEach方法,瀏覽器的JavaScript引擎會為它提供一些底層的優(yōu)化,但是當(dāng)我們使用數(shù)據(jù)索引技術(shù)時,JavaScript引擎沒有提供對應(yīng)的優(yōu)化。這告訴我們:在真正測試之前,你永遠(yuǎn)不會知道。

結(jié)論

在我們試圖解釋如何使用performance.now()方法得到JavaScript精確執(zhí)行時間的過程中,我們偶然發(fā)現(xiàn)了一個基準(zhǔn)場景,它的運行結(jié)果和我們的直覺相反。問題在于,如果你想要編寫更快的web應(yīng)用,我們需要優(yōu)化JavaScript代碼。因為計算機(jī)(幾乎)是一個活生生的東西,它很難預(yù)測,有時會帶來“驚喜”,所以如果了解我們代碼是否運行更快,最可靠的方式就是編寫測試代碼并進(jìn)行比較。

當(dāng)我們有多種方式來做一件事情時,我們不知道哪種方式運行更快的另一個原因是要考慮上下文。在上一節(jié)中,我們執(zhí)行一個大小寫不敏感的字符串查詢來尋找1個字符串是否在其它26個字符串中。當(dāng)我們換一個角度來比較1個字符串是否在其他100,000個字符串中時,結(jié)論可能是完全不同的。

上面的列表不是很完整的,因為還有更多的缺陷需要我們?nèi)グl(fā)現(xiàn)。例如,測試不現(xiàn)實的場景或者只在JavaScript引擎上測試。但是確定的是對于JavaScript開發(fā)者來說,如果你想編寫更好更快的Web應(yīng)用,performance.now()是一個很棒的方法。***但并非最不重要,請謹(jǐn)記衡量執(zhí)行時間只是“更好的代碼”的一反面。我們還要考慮內(nèi)存消耗以及代碼復(fù)雜度。

怎么樣?你是否曾經(jīng)使用這個函數(shù)來測試你的代碼性能?如果沒有,那你是怎么來測試性能的?請在下面的評論中分享你的想法,讓我們開始討論吧! 

責(zé)任編輯:龐桂玉 來源: 前端大全
相關(guān)推薦

2012-12-18 13:32:45

IBMdW

2015-07-20 16:41:16

MongoDBJavaScript

2011-09-29 09:50:44

JavaScript

2011-02-18 15:25:04

2023-09-18 16:14:35

性能測試開發(fā)

2013-12-25 10:32:41

MySQL性能測試

2013-05-08 09:31:32

MangoDB

2011-03-15 16:34:36

Iptables性能

2022-12-15 08:00:38

JavaScript錯誤性能

2009-06-10 22:00:57

JavaScript腳

2012-12-17 13:51:22

Web前端JavaScriptJS

2009-06-11 17:15:23

JavaScript性

2014-11-25 10:03:42

JavaScript

2022-11-17 08:00:18

JavaScript錯誤性能

2021-12-29 10:30:15

JMH代碼Java

2011-07-04 17:38:47

性能測試

2013-12-25 09:32:52

測試平均性能

2012-02-15 09:45:38

性能測試

2020-05-15 08:48:06

JavaScript函數(shù)性能

2016-11-30 18:35:03

JavaScript
點贊
收藏

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

99免费视频观看| 国产欧美在线一区二区| 人与动物性xxxx| 凹凸av导航大全精品| 精品久久久国产| 亚洲ai欧洲av| 日本毛片在线观看| 美女在线观看视频一区二区| 久精品免费视频| 日本少妇高潮喷水xxxxxxx| 亚洲精品一区av| 精品久久久久久| 男女激烈动态图| 韩国中文字幕2020精品| 国内精品伊人久久久久av影院| 日韩免费视频一区| 六月丁香婷婷在线| 午夜影院免费在线| 国产嫩草影院久久久久| 国产精品亚洲综合| 一级黄色片免费看| 免费久久99精品国产自在现线| 精品日韩在线一区| 最近中文字幕一区二区| 黑人精品视频| 中文字幕在线观看一区二区| 久久99久久99精品蜜柚传媒| 精品人妻无码一区二区三区蜜桃一| 亚洲欧美综合久久久| 亚洲片国产一区一级在线观看| 久久久久久久久久久久久国产精品 | 久久97精品久久久久久久不卡| 美女黄色片视频| a天堂资源在线| 曰韩精品一区二区| 亚洲自拍偷拍一区二区三区| 你懂的在线播放| 成人国产视频在线观看| 91久久大香伊蕉在人线| 亚洲一区在线观| 日韩黄色片在线观看| 538国产精品视频一区二区| 久久久久亚洲av无码专区体验| 粉嫩久久久久久久极品| 91精品国产综合久久精品app| 久久人妻无码一区二区| 看女生喷水的网站在线观看| 国产视频视频一区| 日本在线一区| 久草在线免费福利资源| 久久婷婷色综合| 你懂的视频在线一区二区| 五月婷婷丁香花| 99久久婷婷国产综合精品| 国产亚洲一区二区三区在线播放| 瑟瑟视频在线免费观看| 久久精品男女| 热门国产精品亚洲第一区在线| 卡通动漫亚洲综合| 中文字幕一区二区三三| 久久久极品av| 黄页网站免费观看| 亚洲无线视频| 2018中文字幕一区二区三区| 日韩 欧美 综合| 久久精品动漫| 国产精品一区av| 国产美女www爽爽爽视频| 激情综合一区二区三区| 91视频免费进入| 亚洲精品人妻无码| 91一区二区三区在线观看| 蜜桃传媒一区二区| www 日韩| 亚洲欧美国产77777| youjizz.com在线观看| 9999在线视频| 在线观看日韩av先锋影音电影院| www.成年人视频| 爱啪啪综合导航| 日本韩国精品一区二区在线观看| 久久国产精品免费观看| 青春草视频在线观看| 欧美日韩国产中字| 青青青在线视频免费观看| 视频欧美精品| 欧美精品一区视频| 日本一二三不卡视频| 综合久久婷婷| 日本成人在线视频网址| 国产精品老熟女视频一区二区| 日韩国产欧美在线播放| 91夜夜未满十八勿入爽爽影院 | 菠萝蜜视频国产在线播放| 亚洲国产精品久久人人爱| 欧美一级片中文字幕| 99久久久成人国产精品| 亚洲经典中文字幕| 欧美性生给视频| 91久久中文| 国产美女精彩久久| 无码国产色欲xxxx视频| 中文字幕亚洲一区二区va在线| 欧美极品视频一区二区三区| 91网页在线观看| 亚洲高清三级视频| 日韩成人精品视频在线观看| 欧美男人操女人视频| 久久精品电影网站| 日韩欧美在线观看免费| 国产成a人无v码亚洲福利| 亚洲精品一卡二卡三卡四卡| 电影在线观看一区| 91精品欧美一区二区三区综合在| 午夜免费福利视频在线观看| 麻豆一区二区麻豆免费观看| 久久偷看各类女兵18女厕嘘嘘| 亚洲精品自拍视频在线观看| 国产日韩一区二区三区在线| 亚洲一区二区三区在线免费观看| 国产精品亚洲欧美在线播放| 久久先锋资源网| www.18av.com| 精品国产不卡一区二区| 亚洲最新av网址| 国产综合精品视频| 不卡av免费在线观看| 9191国产视频| 高清久久精品| 综合网中文字幕| 国产真人无遮挡作爱免费视频| 麻豆精品一二三| 欧美影视一区二区| 极品美女一区| 亚洲精品一区中文| 国产成人愉拍精品久久| 欧美暴力调教| 粉嫩av亚洲一区二区图片| 区一区二区三区中文字幕| 51av在线| 亚洲国产精品va在看黑人| 青青草国产在线观看| 国内精品免费在线观看| 一区二区三区视频在线播放| 午夜av成人| 亚洲欧美在线一区二区| aaaaaa毛片| 久久久午夜精品理论片中文字幕| 午夜精品一区二区在线观看 | 国产日韩av网站| 精品国产第一国产综合精品| 精品国产一区二区三区久久久| 久久精品免费在线| 成人国产亚洲欧美成人综合网| 欧美视频观看一区| 免费电影日韩网站| 日韩电影第一页| 久久久免费高清视频| 久久久另类综合| 黄色三级视频在线| 日韩精品一区二区三区免费观看| 久久不射电影网| 国产绿帽一区二区三区| 亚洲天堂免费在线观看视频| 精品国产乱码久久久久久1区二区| 国产欧美三级电影| 91精品国产99| 久久精品国产亚洲a∨麻豆| 欧美在线短视频| 日本裸体美女视频| 国产一区二区日韩精品| 婷婷无套内射影院| 美女毛片一区二区三区四区| 国产精品久久久久久久app| 91露出在线| 日韩精品在线一区二区| av大片免费在线观看| 国产欧美视频一区二区三区| 8x8x成人免费视频| 亚洲国产高清一区| 欧美亚洲丝袜| 亚洲最大的免费视频网站| 欧美国产日本高清在线 | 日韩电影第一页| 黄色片视频免费| 中文字幕一区二区三区乱码在线| 亚洲欧美自拍另类日韩| 欧美私人啪啪vps| 久久久婷婷一区二区三区不卡| 黄网站在线观| 亚洲欧美综合另类中字| 夜夜嗨aⅴ一区二区三区| 亚洲制服丝袜av| 欧美性猛交xxxx乱| 国产盗摄精品一区二区三区在线| 日本福利视频导航| 另类ts人妖一区二区三区| 国产精品久久久久久亚洲调教| 手机看片1024国产| 欧洲中文字幕精品| 久久在线视频精品| 国产三级欧美三级| 一级全黄裸体片| 天堂资源在线中文精品| 毛片在线视频观看| 日韩电影二区| 精品一区二区日本| 国产精品视频首页| 日本在线观看天堂男亚洲| av片哪里在线观看| 国产一区二区三区四区福利| 隣の若妻さん波多野结衣| 欧美性生活一区| 国内免费精品视频| 一区二区三区中文在线| 无码人妻丰满熟妇啪啪欧美| 不卡一区在线观看| 交换做爰国语对白| 免费人成在线不卡| 男人揉女人奶房视频60分| 午夜精品剧场| 一区二区三区的久久的视频| 亚洲区小说区图片区qvod| 不卡一区二区三区视频| 欧美aaaaaaaa| 国产精品久久久久久久午夜| 亚洲性色av| 久久久久久尹人网香蕉| sm国产在线调教视频| 中文字幕久热精品视频在线| 日韩有码电影| 亚洲精品在线免费观看视频| 亚洲AV无码国产精品午夜字幕| 亚洲一区二区三区国产| 自拍偷拍你懂的| 久久久亚洲综合| 欧美xxxx×黑人性爽| 国产精品911| 日本黄色一级网站| 国产一区二区三区美女| 亚洲人视频在线| 看片的网站亚洲| 成人免费在线观看视频网站| 日本伊人色综合网| 天天爽天天爽夜夜爽| 日韩在线播放一区二区| 欧美日韩在线免费播放| 美女诱惑黄网站一区| 无码精品国产一区二区三区免费| 久久精品av| 中文字幕一区二区三区乱码| 国产精品伦理久久久久久| 亚洲精品久久区二区三区蜜桃臀| 日韩精品成人在线观看| 91在线视频导航| 日韩成人久久| 国产精品一区视频网站| 欧美一区自拍| 免费国产在线精品一区二区三区| 亚洲日日夜夜| 91免费版黄色| 国产乱人伦精品一区| 久久av一区二区三区亚洲| 亚洲aa在线| 天堂一区二区三区| 91精品99| 天天夜碰日日摸日日澡性色av| 日韩国产一区二区| 偷拍盗摄高潮叫床对白清晰| 亚洲综合色网| 91成人在线观看喷潮教学| 久久精品人人做人人爽电影蜜月| 在线看成人av电影| 欧美午夜不卡| aaa毛片在线观看| 久久99蜜桃精品| 国产乱国产乱老熟300部视频| 青青青伊人色综合久久| 激情五月婷婷基地| 成人av网站大全| 一区二区三区伦理片| 亚洲欧美欧美一区二区三区| 福利一区二区三区四区| 色视频一区二区| av在线亚洲天堂| 日韩h在线观看| 欧美边添边摸边做边爱免费| 久久久久久久91| 日韩av超清在线观看| 亚洲在线观看视频| 亚洲最好看的视频| 国产高清不卡无码视频| 久久九九免费| 天天爽夜夜爽视频| 国产日韩欧美综合一区| 日本黄色小说视频| 91久久国产综合久久| 亚洲av无码片一区二区三区| 亚洲午夜精品久久久久久性色| 欧美69xxxxx| 欧美成人免费大片| 123成人网| 免费av在线一区二区| 欧美一区成人| 午夜视频你懂的| 91视频你懂的| 毛片a片免费观看| 欧美日韩一区高清| 天堂网在线中文| 久久影视电视剧免费网站清宫辞电视 | 天堂v在线视频| 香蕉久久久久久久av网站| 日本女人黄色片| 国产精品麻豆久久久| www.中文字幕在线观看| 精品捆绑美女sm三区| 国产在线高清理伦片a| 日韩美女在线观看| 东京久久高清| 乱熟女高潮一区二区在线| 久久成人羞羞网站| 国产jk精品白丝av在线观看| 一区二区三区加勒比av| 136福利视频导航| 亚洲欧美色婷婷| 亚洲涩涩在线| 精品在线不卡| 亚洲免费高清| 亚洲激情 欧美| 性做久久久久久免费观看| 朝桐光av在线一区二区三区| 精品国产一区二区三区四区在线观看| 成年人视频在线看| 国产91成人video| 卡通动漫国产精品| av在线播放天堂| 国产激情视频一区二区三区欧美 | 国产一级免费视频| 精品国产乱子伦一区| 日韩精品亚洲人成在线观看| 亚洲精品欧美极品| 亚洲国产一成人久久精品| 日韩在线第三页| 国产欧美日韩卡一| 在线不卡免费视频| 色偷偷av一区二区三区乱| 成人全视频免费观看在线看| 亚洲欧美国产精品桃花| 久久91精品国产91久久小草| 老司机精品免费视频| 欧美日本韩国一区| 国产日产一区二区三区| 91精品网站| 国产精品sm| 日本一区二区在线观看视频| 亚洲图片自拍偷拍| 四虎永久在线观看| 热草久综合在线| 欧美日韩性在线观看| 亚欧美在线观看| 亚洲天堂a在线| 亚洲精华国产精华精华液网站| 国产一区二区黑人欧美xxxx| 成人日韩精品| 中国人体摄影一区二区三区| 国产麻豆一精品一av一免费| 久一视频在线观看| 精品中文视频在线| 欧美影视资讯| 一级黄色片播放| 成人小视频在线观看| 亚洲s码欧洲m码国产av| 色小说视频一区| 亚洲国产欧美国产第一区| 你懂的av在线| 中文在线一区二区| 国产免费叼嘿网站免费| 国a精品视频大全| 奇米影视亚洲| 久久久国产精品久久久| 激情懂色av一区av二区av| 大乳在线免费观看| 亚洲最大的av网站| 国产欧美一区二区色老头 | 99久久久无码国产精品免费蜜柚| 欧美一区二区三区在线观看| 黄色污污视频在线观看| 免费久久一级欧美特大黄| 激情六月婷婷久久| 97久久久久久久| 久久精品亚洲精品| 天堂一区二区三区四区| 手机在线国产视频| 狠狠干狠狠久久| 污片视频在线免费观看| 日本一区二区免费看| 成人午夜伦理影院| 曰批又黄又爽免费视频| 国外视频精品毛片| 欧美gayvideo|