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

JavaScript啟動(dòng)性能瓶頸分析與解決方案

開發(fā) 前端
本文則會(huì)深入分析瀏覽器對(duì)于 JavaScript 的這些處理流程,挖掘出那些影響你應(yīng)用啟動(dòng)時(shí)間的罪魁禍?zhǔn)祝⑶腋鶕?jù)我個(gè)人的經(jīng)驗(yàn)提出相對(duì)應(yīng)的解決方案。

在 Web 開發(fā)中,隨著需求的增加與代碼庫的擴(kuò)張,我們最終發(fā)布的 Web 頁面也逐漸膨脹。不過這種膨脹遠(yuǎn)不止意味著占據(jù)更多的傳輸帶寬,其還意味著用戶瀏覽網(wǎng)頁時(shí)可能更差勁的性能體驗(yàn)。瀏覽器在下載完某個(gè)頁面依賴的腳本之后,其還需要經(jīng)過語法分析、解釋與運(yùn)行這些步驟。而本文則會(huì)深入分析瀏覽器對(duì)于 JavaScript 的這些處理流程,挖掘出那些影響你應(yīng)用啟動(dòng)時(shí)間的罪魁禍?zhǔn)祝⑶腋鶕?jù)我個(gè)人的經(jīng)驗(yàn)提出相對(duì)應(yīng)的解決方案。回顧過去,我們還沒有專門地考慮過如何去優(yōu)化 JavaScript 解析/編譯這些步驟;我們預(yù)想中的是解析器在發(fā)現(xiàn) <script>標(biāo)簽后會(huì)瞬時(shí)完成解析操作,不過這很明顯是癡人說夢(mèng)。下圖是對(duì)于 V8 引擎工作原理的概述:

下面我們深入其中的關(guān)鍵步驟進(jìn)行分析。

到底是什么拖慢了我們應(yīng)用的啟動(dòng)時(shí)間?

在啟動(dòng)階段,語法分析,編譯與腳本執(zhí)行占據(jù)了 JavaScript 引擎運(yùn)行的絕大部分時(shí)間。換言之,這些過程造成的延遲會(huì)真實(shí)地反應(yīng)到用戶可交互時(shí)延上;譬如用戶已經(jīng)看到了某個(gè)按鈕,但是要好幾秒之后才能真正地去點(diǎn)擊操作,這一點(diǎn)會(huì)大大影響用戶體驗(yàn)。

上圖是我們使用 Chrome Canary 內(nèi)置的 V8 RunTime Call Stats 對(duì)于某個(gè)網(wǎng)站的分析結(jié)果;需要注意的是桌面瀏覽器中語法解析與編譯占用的時(shí)間還是蠻長的,而在移動(dòng)端中占用的時(shí)間則更長。實(shí)際上,對(duì)于 Facebook, Wikipedia, Reddit 這些大型網(wǎng)站中語法解析與編譯所占的時(shí)間也不容忽視:

上圖中的粉色區(qū)域表示花費(fèi)在 V8 與 Blink's C++ 中的時(shí)間,而橙色和黃色分別表示語法解析與編譯的時(shí)間占比。Facebook 的 Sebastian Markbage 與 Google 的 Rob Wormald 也都在 Twitter 發(fā)文表示過 JavaScript 的語法解析時(shí)間過長已經(jīng)成為了不可忽視的問題,后者還表示這也是 Angular 啟動(dòng)時(shí)主要的消耗之一。

隨著移動(dòng)端浪潮的涌來,我們不得不面對(duì)一個(gè)殘酷的事實(shí):移動(dòng)端對(duì)于相同包體的解析與編譯過程要花費(fèi)相當(dāng)于桌面瀏覽器2~5倍的時(shí)間。當(dāng)然,對(duì)于高配的 iPhone 或者 Pixel 這樣的手機(jī)相較于 Moto G4 這樣的中配手機(jī)表現(xiàn)會(huì)好很多;這一點(diǎn)提醒我們?cè)跍y試的時(shí)候不能僅用身邊那些高配的手機(jī),而應(yīng)該中高低配兼顧:

上圖是部分桌面瀏覽器與移動(dòng)端瀏覽器對(duì)于 1MB 的 JavaScript 包體進(jìn)行解析的時(shí)間對(duì)比,顯而易見的可以發(fā)現(xiàn)不同配置的移動(dòng)端手機(jī)之間的巨大差異。當(dāng)我們應(yīng)用包體已經(jīng)非常巨大的時(shí)候,使用一些現(xiàn)代的打包技巧,譬如代碼分割,TreeShaking,Service Workder 緩存等等會(huì)對(duì)啟動(dòng)時(shí)間有很大的影響。另一個(gè)角度來看,即使是小模塊,你代碼寫的很糟或者使用了很糟的依賴庫都會(huì)導(dǎo)致你的主線程花費(fèi)大量的時(shí)間在編譯或者冗余的函數(shù)調(diào)用中。我們必須要清醒地認(rèn)識(shí)到全面評(píng)測以挖掘出真正性能瓶頸的重要性。

JavaScript 語法解析與編譯是否成為了大部分網(wǎng)站的瓶頸?

我曾不止一次聽到有人說,我又不是 Facebook,你說的 JavaScript 語法解析與編譯到

底會(huì)對(duì)其他網(wǎng)站造成什么樣的影響呢?對(duì)于這個(gè)問題我也很好奇,于是我花費(fèi)了兩個(gè)月的時(shí)間對(duì)于超過 6000 個(gè)網(wǎng)站進(jìn)行分析;這些網(wǎng)站囊括了 React,Angular,Ember,Vue 這些流行的框架或者庫。大部分的測試是基于 WebPageTest 進(jìn)行的,因此你可以很方便地重現(xiàn)這些測試結(jié)果。光纖接入的桌面瀏覽器大概需要 8 秒的時(shí)間才能允許用戶交互,而 3G 環(huán)境下的 Moto G4 大概需要 16 秒 才能允許用戶交互。

大部分應(yīng)用在桌面瀏覽器中會(huì)耗費(fèi)約 4 秒的時(shí)間進(jìn)行 JavaScript 啟動(dòng)階段(語法解析、編譯、執(zhí)行):

而在移動(dòng)端瀏覽器中,大概要花費(fèi)額外 36% 的時(shí)間來進(jìn)行語法解析:

另外,統(tǒng)計(jì)顯示并不是所有的網(wǎng)站都甩給用戶一個(gè)龐大的 JS 包體,用戶下載的經(jīng)過 Gzip 壓縮的平均包體大小是 410KB,這一點(diǎn)與 HTTPArchive 之前發(fā)布的 420KB 的數(shù)據(jù)基本一致。不過最差勁的網(wǎng)站則是直接甩了 10MB 的腳本給用戶,簡直可怕。

通過上面的統(tǒng)計(jì)我們可以發(fā)現(xiàn),包體體積固然重要,但是其并非唯一因素,語法解析與編譯的耗時(shí)也不一定隨著包體體積的增長而線性增長。總體而言小的 JavaScript 包體是會(huì)加載地更快(忽略瀏覽器、設(shè)備與網(wǎng)絡(luò)連接的差異),但是同樣 200KB 的大小,不同開發(fā)者的包體在語法解析、編譯上的時(shí)間卻是天差地別,不可同日而語。

現(xiàn)代 JavaScript 語法解析 & 編譯性能評(píng)測

Chrome DevTools

打開 Timeline( Performance panel ) > Bottom-Up/Call Tree/Event Log 就會(huì)顯示出當(dāng)前網(wǎng)站在語法解析/編譯上的時(shí)間占比。如果你希望得到更完整的信息,那么可以打開 V8 的 Runtime Call Stats。在 Canary 中,其位于 Timeline 的 Experims > V8 Runtime Call Stats 下。

Chrome Tracing

打開 about:tracing 頁面,Chrome 提供的底層的追蹤工具允許我們使用disabled-by-default-v8.runtime_stats來深度了解 V8 的時(shí)間消耗情況。V8 也提供了詳細(xì)的指南來介紹如何使用這個(gè)功能。

WebPageTest

WebPageTest 中 Processing Breakdown 頁面在我們啟用 Chrome > Capture Dev Tools Timeline 時(shí)會(huì)自動(dòng)記錄 V8 編譯、EvaluateScript 以及 FunctionCall 的時(shí)間。我們同樣可以通過指明disabled-by-default-v8.runtime_stats的方式來啟用 Runtime Call Stats。

更多使用說明參考我的gist。

User Timing

我們還可以使用 Nolan Lawson 推薦的User Timing API來評(píng)估語法解析的時(shí)間。不過這種方式可能會(huì)受 V8 預(yù)解析過程的影響,我們可以借鑒 Nolan 在 optimize-js 評(píng)測中的方式,在腳本的尾部添加隨機(jī)字符串來解決這個(gè)問題。我基于 Google Analytics 使用相似的方式來評(píng)估真實(shí)用戶與設(shè)備訪問網(wǎng)站時(shí)候的解析時(shí)間:

DeviceTiming

Etsy 的 DeviceTiming 工具能夠模擬某些受限環(huán)境來評(píng)估頁面的語法解析與執(zhí)行時(shí)間。其將本地腳本包裹在了某個(gè)儀表工具代碼內(nèi)從而使我們的頁面能夠模擬從不同的設(shè)備中訪問。可以閱讀 Daniel Espeset 的Benchmarking JS Parsing and Execution on Mobile Devices 一文來了解更詳細(xì)的使用方式。

我們可以做些什么以降低 JavaScript 的解析時(shí)間?

減少 JavaScript 包體體積。我們?cè)谏衔闹幸蔡峒埃〉陌w往往意味著更少的解析工作量,也就能降低瀏覽器在解析與編譯階段的時(shí)間消耗。

使用代碼分割工具來按需傳遞代碼與懶加載剩余模塊。這可能是最佳的方式了,類似于PRPL這樣的模式鼓勵(lì)基于路由的分組,目前被 Flipkart, Housing.com 與 Twitter 廣泛使用。

Script streaming: 過去 V8 鼓勵(lì)開發(fā)者使用async/defer來基于script streaming實(shí)現(xiàn) 10-20% 的性能提升。這個(gè)技術(shù)會(huì)允許 HTML 解析器將相應(yīng)的腳本加載任務(wù)分配給專門的 script streaming 線程,從而避免阻塞文檔解析。V8 推薦盡早加載較大的模塊,畢竟我們只有一個(gè) streamer 線程。

評(píng)估我們依賴的解析消耗。我們應(yīng)該盡可能地選擇具有相同功能但是加載地更快的依賴,譬如使用 Preact 或者 Inferno 來代替 React,二者相較于 React 體積更小具有更少的語法解析與編譯時(shí)間。Paul Lewis 在最近的一篇文章中也討論了框架啟動(dòng)的代價(jià),與 Sebastian Markbage 的說法不謀而合:最好地評(píng)測某個(gè)框架啟動(dòng)消耗的方式就是先渲染一個(gè)界面,然后刪除,最后進(jìn)行重新渲染。第一次渲染的過程會(huì)包含了分析與編譯,通過對(duì)比就能發(fā)現(xiàn)該框架的啟動(dòng)消耗。

如果你的 JavaScript 框架支持 AOT(ahead-of-time)編譯模式,那么能夠有效地減少解析與編譯的時(shí)間。Angular 應(yīng)用就受益于這種模式:

現(xiàn)代瀏覽器是如何提高解析與編譯速度的?

不用灰心,你并不是唯一糾結(jié)于如何提升啟動(dòng)時(shí)間的人,我們 V8 團(tuán)隊(duì)也一直在努力。我們發(fā)現(xiàn)之前的某個(gè)評(píng)測工具 Octane 是個(gè)不錯(cuò)的對(duì)于真實(shí)場景的模擬,它在微型框架與冷啟動(dòng)方面很符合真實(shí)的用戶習(xí)慣。而基于這些工具,V8 團(tuán)隊(duì)在過去的工作中也實(shí)現(xiàn)了大約 25% 的啟動(dòng)性能提升:

本部分我們就會(huì)對(duì)過去幾年中我們使用的提升語法解析與編譯時(shí)間的技巧進(jìn)行闡述。

代碼緩存

Chrome 42 開始引入了所謂的代碼緩存的概念,為我們提供了一種存放編譯后的代碼副本的機(jī)制,從而當(dāng)用戶二次訪問該頁面時(shí)可以避免腳本抓取、解析與編譯這些步驟。除以之外,我們還發(fā)現(xiàn)在重復(fù)訪問的時(shí)候這種機(jī)制還能避免 40% 左右的編譯時(shí)間,這里我會(huì)深入介紹一些內(nèi)容:

  •  代碼緩存會(huì)對(duì)于那些在 72 小時(shí)之內(nèi)重復(fù)執(zhí)行的腳本起作用。
  •  對(duì)于 Service Worker 中的腳本,代碼緩存同樣對(duì) 72 小時(shí)之內(nèi)的腳本起作用。
  •  對(duì)于利用 Service Worker 緩存在 Cache Storage 中的腳本,代碼緩存能在腳本首次執(zhí)行的時(shí)候起作用。

總而言之,對(duì)于主動(dòng)緩存的 JavaScript 代碼,最多在第三次調(diào)用的時(shí)候其能夠跳過語法分析與編譯的步驟。我們可以通過chrome://flags/#v8-cache-strategies-for-cache-storage來查看其中的差異,也可以設(shè)置 js-flags=profile-deserialization運(yùn)行 Chrome 來查看代碼是否加載自代碼緩存。不過需要注意的是,代碼緩存機(jī)制僅會(huì)緩存那些經(jīng)過編譯的代碼,主要是指那些頂層的往往用于設(shè)置全局變量的代碼。而對(duì)于類似于函數(shù)定義這樣懶編譯的代碼并不會(huì)被緩存,不過 IIFE 同樣被包含在了 V8 中,因此這些函數(shù)也是可以被緩存的。

Script Streaming

Script Streaming允許在后臺(tái)線程中對(duì)異步腳本執(zhí)行解析操作,可以對(duì)于頁面加載時(shí)間有大概 10% 的提升。上文也提到過,這個(gè)機(jī)制同樣會(huì)對(duì)同步腳本起作用。

這個(gè)特性倒是第一次提及,因此 V8 會(huì)允許所有的腳本,即使阻塞型的 <scriptsrc=''>腳本也可以由后臺(tái)線程進(jìn)行解析。不過缺陷就是目前僅有一個(gè) streaming 后臺(tái)線程存在,因此我們建議首先解析大的、關(guān)鍵性的腳本。在實(shí)踐中,我們建議將 <scriptdefer>添加到 <head>塊內(nèi),這樣瀏覽器引擎就能夠盡早地發(fā)現(xiàn)需要解析的腳本,然后將其分配給后臺(tái)線程進(jìn)行處理。我們也可以查看 DevTools Timeline 來確定腳本是否被后臺(tái)解析,特別是當(dāng)你存在某個(gè)關(guān)鍵性腳本需要解析的時(shí)候,更需要確定該腳本是由 streaming 線程解析的。

語法解析 & 編譯優(yōu)化

我們同樣致力于打造更輕量級(jí)、更快的解析器,目前 V8 主線程中最大的瓶頸在于所謂的非線性解析消耗。譬如我們有如下的代碼片:   

  1. (function(global, module) { … })(this, functionmodule() { my functions }) 

V8 并不知道我們編譯主腳本的時(shí)候是否需要module這個(gè)模塊,因此我們會(huì)暫時(shí)放棄編譯它。而當(dāng)我們打算編譯module時(shí),我們需要重分析所有的內(nèi)部函數(shù)。這也就是所謂的 V8 解析時(shí)間非線性的原因,任何一個(gè)處于 N 層深度的函數(shù)都有可能被重新分析 N 次。V8 已經(jīng)能夠在首次編譯的時(shí)候搜集所有內(nèi)部函數(shù)的信息,因此在未來的編譯過程中 V8 會(huì)忽略所有的內(nèi)部函數(shù)。對(duì)于上面這種module形式的函數(shù)會(huì)是很大的性能提升,建議閱讀The V8 Parser(s) — Design, Challenges, and Parsing JavaScript Better來獲取更多內(nèi)容。V8 同樣在尋找合適的分流機(jī)制以保證啟動(dòng)時(shí)能在后臺(tái)線程中執(zhí)行 JavaScript 編譯過程。

預(yù)編譯 JavaScript?

每隔幾年就有人提出引擎應(yīng)該提供一些處理預(yù)編譯腳本的機(jī)制,換言之,開發(fā)者可以使用構(gòu)建工具或者其他服務(wù)端工具將腳本轉(zhuǎn)化為字節(jié)碼,然后瀏覽器直接運(yùn)行這些字節(jié)碼即可。從我個(gè)人觀點(diǎn)來看,直接傳送字節(jié)碼意味著更大的包體,勢(shì)必會(huì)增加加載時(shí)間;并且我們需要去對(duì)代碼進(jìn)行簽名以保證能夠安全運(yùn)行。目前我們對(duì)于 V8 的定位是盡可能地避免上文所說的內(nèi)部重分析以提高啟動(dòng)時(shí)間,而預(yù)編譯則會(huì)帶來額外的風(fēng)險(xiǎn)。不過我們歡迎大家一起來討論這個(gè)問題,雖然 V8 目前專注于提升編譯效率以及推廣利用 Service Worker 緩存腳本代碼來提升啟動(dòng)效率。我們?cè)?BlinkOn7 上與 Facebook 以及 Akamai 也討論過預(yù)編譯相關(guān)內(nèi)容。

Optimize JS 優(yōu)化

類似于 V8 這樣的 JavaScript 引擎在進(jìn)行完整的解析之前會(huì)對(duì)腳本中的大部分函數(shù)進(jìn)行預(yù)解析,這主要是考慮到大部分頁面中包含的 JavaScript 函數(shù)并不會(huì)立刻被執(zhí)行。

預(yù)編譯能夠通過只處理那些瀏覽器運(yùn)行所需要的最小函數(shù)集合來提升啟動(dòng)時(shí)間,不過這種機(jī)制在 IIFE 面前卻反而降低了效率。盡管引擎希望避免對(duì)這些函數(shù)進(jìn)行預(yù)處理,但是遠(yuǎn)不如optimize-js這樣的庫有作用。optimize-js 會(huì)在引擎之前對(duì)于腳本進(jìn)行處理,對(duì)于那些立即執(zhí)行的函數(shù)插入圓括號(hào)從而保證更快速地執(zhí)行。這種預(yù)處理對(duì)于 Browserify, Webpack 生成包體這樣包含了大量即刻執(zhí)行的小模塊起到了非常不錯(cuò)的優(yōu)化效果。盡管這種小技巧并非 V8 所希望使用的,但是在當(dāng)前階段不得不引入相應(yīng)的優(yōu)化機(jī)制。

總結(jié)

啟動(dòng)階段的性能至關(guān)重要,緩慢的解析、編譯與執(zhí)行時(shí)間可能成為你網(wǎng)頁性能的瓶頸所在。我們應(yīng)該評(píng)估頁面在這個(gè)階段的時(shí)間占比并且選擇合適的方式來優(yōu)化。我們也會(huì)繼續(xù)致力于提升 V8 的啟動(dòng)性能,盡我所能! 

 

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

2017-02-15 09:40:38

JavaScript分析解決

2025-07-31 01:55:00

await性能流式格式

2024-11-25 07:00:00

2011-05-04 16:33:09

游戲銷售Android Mar游戲

2009-08-03 18:06:28

JS性能問題

2017-08-01 17:01:49

IOT梯聯(lián)網(wǎng)AWS

2020-03-23 14:35:28

前端架構(gòu)應(yīng)用程序

2025-06-10 01:55:00

代碼Promise

2009-07-31 11:41:12

光纖連接數(shù)據(jù)中心

2012-02-07 17:33:07

2009-06-10 22:13:55

JavaScriptExcel打印

2011-09-27 09:42:01

Linux系統(tǒng)

2010-10-08 13:27:51

IE6pngJavaScript

2012-11-01 11:29:29

2023-06-09 12:59:52

Python性能分析

2024-02-02 15:21:08

工具頁面性能

2017-06-05 16:16:11

技術(shù)業(yè)務(wù)性

2019-10-31 11:50:19

MySQL數(shù)據(jù)庫Windows

2022-04-29 15:24:53

Redis存儲(chǔ)慢查詢

2011-07-05 15:39:50

FTTH
點(diǎn)贊
收藏

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

亚洲激情在线观看| 大荫蒂欧美视频另类xxxx| 成人高清视频观看www| 国产一二三区精品| 国产精品videossex| 一本大道久久a久久精品综合| 亚洲欧洲国产日韩精品| 亚洲av无码乱码国产精品| 国产欧美一区二区色老头 | 国产不卡的av| 涩涩视频在线| 亚洲日本一区二区| 久久综合精品一区| 国产又爽又黄免费软件| 亚洲每日在线| 久久综合久久八八| xxxx日本免费| av成人男女| 欧美精品一二三四| 国产精品动漫网站| 亚洲图区一区| 中文字幕第一区二区| 国产一区二区无遮挡| 国产精品毛片一区二区在线看舒淇 | 亚洲福利视频网站| 亚洲娇小娇小娇小| 性欧美gay| 天天爽夜夜爽夜夜爽精品视频| 亚洲综合欧美日韩| 男女污视频在线观看| 豆国产96在线|亚洲| 国产综合香蕉五月婷在线| 91精品国产综合久久久蜜臀九色| 亚洲手机在线| 久久久精品一区二区三区| 手机看片福利视频| 尤物tv在线精品| 亚洲精品suv精品一区二区| 蜜桃福利午夜精品一区| 日韩av首页| 在线区一区二视频| 1024av视频| sm捆绑调教国产免费网站在线观看 | av岛国在线| 亚洲老司机在线| 久久av秘一区二区三区| 在线观看免费版| 国产无一区二区| 久久草视频在线看| 污视频软件在线观看| fc2成人免费人成在线观看播放| 91九色对白| 国产永久免费视频| 国产一区二区三区视频在线播放| 国产美女久久久| 在线观看xxxx| 久热成人在线视频| 国产免费一区二区三区在线观看 | 日韩国产精品久久久久久亚洲| 97视频免费观看| 1级黄色大片儿| 国产精品一区亚洲| 日韩**中文字幕毛片| 中文字幕免费观看| 日韩av一二三| 成人激情视频网| 99视频免费看| 成人性色生活片免费看爆迷你毛片| 国产精品久久国产三级国电话系列 | 亚洲不卡在线播放| 欧美日本一区二区高清播放视频| 欧美国产日韩精品| 亚洲一区欧美在线| 日韩不卡免费视频| 91在线视频导航| 国产18精品乱码免费看| 99久久综合国产精品| 欧美一区二区三区成人久久片| 激情在线视频| 综合久久久久久| 男的插女的下面视频| 97se综合| 欧美疯狂性受xxxxx喷水图片| 一区二区在线免费观看视频| 高清精品视频| 在线观看亚洲区| 久久久精品视频免费观看| 国产一区二区三区四区老人| 国产91|九色| 在线观看日批视频| 成人免费视频国产在线观看| 人偷久久久久久久偷女厕| 日本综合在线| 亚洲va韩国va欧美va精品| 国产成人无码av在线播放dvd| 色综合视频一区二区三区44| 精品国产一区二区国模嫣然| 韩国女同性做爰三级| 五月精品视频| 欧美在线不卡区| 97人妻精品一区二区三区动漫| 成人手机在线视频| 一区二区三区四区五区精品| 青青在线视频| 欧美日韩中文一区| 久久久久久久人妻无码中文字幕爆| 女人av一区| 九九精品在线观看| 中文字幕在线2019| 波多野结衣亚洲一区| 亚洲乱码一区二区三区| 岛国av在线播放| 在线不卡免费av| 免费污网站在线观看| 激情久久久久久久| 成人在线观看视频网站| 男男激情在线| 亚洲国产精品视频| 亚洲免费在线播放视频| 精品视频免费| 欧洲中文字幕国产精品| 亚洲AV无码精品色毛片浪潮| 中文字幕亚洲在| 北条麻妃在线一区| 日韩伦理一区二区三区| 久久人体大胆视频| 免费在线不卡av| 成人免费视频网站在线观看| 男女激烈动态图| 久久精品 人人爱| 亚洲午夜小视频| 日日噜噜噜噜人人爽亚洲精品| 成人午夜av在线| 一本色道久久88亚洲精品综合| 久久青草免费| 一本大道久久加勒比香蕉| 成人午夜视频在线播放| thepron国产精品| 日韩极品视频在线观看| 久久中文字幕一区二区| 久久天天躁夜夜躁狠狠躁2022| av一级在线观看| 久久亚洲二区三区| 欧美日韩在线视频一区二区三区| 狼人天天伊人久久| 午夜精品久久久久久久久久久久久| 性一交一乱一色一视频麻豆| 亚洲蜜桃精久久久久久久| 手机免费看av网站| 国产精品传媒精东影业在线| 国产欧美日韩免费看aⅴ视频| 不卡在线视频| 精品视频免费看| 国产wwwwxxxx| 国产在线乱码一区二区三区| 91免费视频黄| 日韩三级久久| 久久人人爽人人| 午夜黄色小视频| 欧美性xxxx极品hd欧美风情| 天堂久久精品忘忧草| 日本va欧美va欧美va精品| 涩涩涩999| 亚洲欧洲日韩精品在线| 两个人的视频www国产精品| 精品久久久中文字幕人妻| 亚洲一区在线播放| 88av在线播放| 久久亚洲美女| 亚洲一区二区三区色| 精品视频成人| 午夜精品久久久久久久男人的天堂 | 日韩欧美一区二区视频在线播放| 成人在线观看免费视频| 麻豆一区二区在线观看| 亚洲爱情岛论坛永久| 亚洲va中文字幕| 精品一区二区三区蜜桃在线| 国产一区日韩二区欧美三区| 老子影院午夜伦不卡大全| 午夜精品影视国产一区在线麻豆| 日本老师69xxx| 大片免费在线观看| 亚洲第一区第一页| 亚洲成人av网址| 亚洲另类春色国产| 黄色国产在线观看| 美女视频第一区二区三区免费观看网站| 大桥未久一区二区三区| 国产欧美三级电影| 国产剧情日韩欧美| 97天天综合网| xx视频.9999.com| 亚洲 国产 欧美 日韩| 欧美视频一区在线观看| 久久久久久久久久综合| 国产日韩欧美在线一区| 成人在线观看一区二区| 日日摸夜夜添夜夜添国产精品| 免费看污污视频| 欧美欧美黄在线二区| 亚洲自拍中文字幕| 亚洲成人短视频| 久久久久久亚洲精品中文字幕| 成人午夜影视| 日韩国产激情在线| www.日韩高清| 欧美性猛交一区二区三区精品| 精品一级少妇久久久久久久| 国产精品色在线| 国产白嫩美女无套久久| 国产伦精品一区二区三区免费迷 | 欧美三级精品| 欧美精品videossex性护士| av在线播放网| 精品在线观看国产| 成人精品在线播放| 91麻豆精品国产91久久久久久 | 亚洲成色777777女色窝| 91中文字幕在线播放| 色综合天天狠狠| 久草视频在线免费看| 最新国产成人在线观看| 美国美女黄色片| 2023国产精品视频| 亚洲天堂2024| 成人午夜视频福利| 手机看片国产精品| 国产综合成人久久大片91| 狠狠热免费视频| 香蕉久久夜色精品国产| 国产免费观看高清视频| 亚洲国产99| 亚洲色成人www永久在线观看| 亚洲国产一区二区在线观看| 五月天亚洲综合小说网| av在线不卡顿| 污视频在线免费观看一区二区三区| 九九热线有精品视频99| 久久婷婷开心| 亚洲专区视频| 久久久久网址| 欧美激情在线精品一区二区三区| 久久99精品久久久久久秒播放器 | 女人床在线观看| 午夜欧美在线| 自拍亚洲欧美老师丝袜| 香蕉久久网站| 丰满人妻一区二区三区53号| 欧美激情视频一区二区三区免费| 成年人三级视频| 欧美色123| 草草视频在线免费观看| 亚洲电影av| 国产精品视频一区二区三区四区五区| 一本久道久久综合婷婷鲸鱼| 日韩免费视频播放| 亚洲综合日韩| 青青青在线视频免费观看| 蜜桃一区二区三区在线观看| 免费成人黄色大片| 国产精一品亚洲二区在线视频| 午夜诱惑痒痒网| 成人视屏免费看| 巨胸大乳www视频免费观看| 国产亚洲精品超碰| 一级免费黄色录像| 亚洲精品美国一| 日本一区二区三区四区五区 | 欧美二区在线视频| 首页亚洲欧美制服丝腿| 天天综合网日韩| 国产成人综合在线播放| 亚洲熟女乱综合一区二区三区 | 色老板免费视频| 亚洲主播在线播放| 91在线视频在线观看| 欧美天堂一区二区三区| 国产成年妇视频| 日韩极品精品视频免费观看| 国产黄色片在线观看| 久久亚洲成人精品| 国产色播av在线| 国产美女搞久久| 精品淫伦v久久水蜜桃| 日本在线高清视频一区| 欧美黄色精品| wwwxxx黄色片| 国产成人在线视频网址| 欧美熟妇激情一区二区三区| 亚洲欧美偷拍卡通变态| 91看片在线播放| 欧美日韩免费一区二区三区| 黄色一级a毛片| 日韩专区中文字幕| 国产乱码精品一区二三赶尸艳谈| 国产日韩欧美电影在线观看| 大伊香蕉精品在线品播放| 色综合久久av| 国产欧美一级| 国产成人精品综合久久久久99| 国产亚洲精品bt天堂精选| 欧美片一区二区| 欧美日韩国产在线观看| 亚洲欧美日本在线观看| 欧美成人午夜激情在线| 日韩精品一区二区三区| 99中文字幕| 久久久久久久久久久久久久| av观看免费在线| 福利电影一区二区三区| 乱老熟女一区二区三区| 日本韩国欧美一区| 欧美自拍偷拍一区二区| 日韩在线播放视频| 日韩电影网站| 鲁片一区二区三区| 尤物精品在线| 中文字幕第10页| 综合精品久久久| 中文字幕在线播放av| 亚洲欧美中文日韩在线| 国产盗摄——sm在线视频| 91久久国产综合久久蜜月精品| 欧美第十八页| 成人午夜激情av| 久久亚洲二区三区| 久久久久久久久影院| 亚洲福利视频网站| 丁香花电影在线观看完整版| 亚洲wwwav| 亚洲国产精品久久久久蝴蝶传媒| 亚洲最大成人在线观看| 国产欧美一区二区精品秋霞影院 | 日本免费在线视频不卡一不卡二| 免费无码一区二区三区| 亚洲第一狼人社区| 亚洲av综合色区无码一区爱av | 国产在线播放一区| 亚洲精品视频网址| 欧美色国产精品| av资源网在线观看| 国产精品看片资源| 欧美日韩一二三四| 欧美一级特黄a| 国产精品久久福利| 国产精品久久久久久免费免熟| 色99之美女主播在线视频| 日韩电影精品| 欧美a级黄色大片| 国产一区不卡在线| 澳门黄色一级片| 日韩精品专区在线影院重磅| 日本高清成人vr专区| 国产91一区二区三区| 亚洲精品社区| 精品无码人妻一区| 日本韩国欧美在线| 日本免费视频在线观看| 成人免费在线视频网址| 亚洲国产成人精品女人| 少妇搡bbbb搡bbb搡打电话| 亚洲6080在线| 免费毛片在线| 国产一区二区在线免费| 综合国产在线| 性色av蜜臀av浪潮av老女人| 欧美日韩国产影院| 国产在线免费观看| 成人免费淫片aa视频免费| 欧美+亚洲+精品+三区| 精品一区二区三区四区五区六区| 一本色道a无线码一区v| av女优在线| 不卡一区二区三区四区五区| 国产一区二区精品| 羞羞在线观看视频| 亚洲电影免费观看| 日本欧美日韩| 国产盗摄视频在线观看| 91丨porny丨国产入口| 最新在线中文字幕| 欧美放荡办公室videos4k| 亚洲精品播放| 日本中文字幕影院| 图片区小说区国产精品视频| 国产黄在线看| 高清视频在线观看一区| 日韩黄色免费电影| 久草免费新视频| 伊人伊成久久人综合网小说| 欧美h版在线观看| 欧美综合在线观看视频| 一区二区在线观看免费视频播放| 天堂a中文在线| 亚洲一区二区日本| 鲁大师影院一区二区三区| 欧美日韩三级在线观看 | 日韩大片在线永久免费观看网站| 国产成人亚洲欧美|