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

從JavaScript的運行原理談解析效率優化

開發 前端
在這篇文章中,我們將重點介紹第一階段并解釋該階段對編寫高效 JavaScript 的影響。我們會按照從左到右、從上到下的順序介紹解析管道,該管道接受源代碼并生成一棵語法樹。

[[312684]]

編寫高效率的 JavaScript ,其中一個關鍵就是要理解它的工作原理。編寫高效代碼的方法數不勝數,例如,你可以編寫對編譯器友好的 JavaScript 代碼,從而避免將一行簡單代碼的運行速度拖慢 7 倍。

本文我們會專注講解可以最小化 Javascript 代碼解析時間的優化方法。我們進一步縮小范圍,只討論 V8 這一驅動 ElectronNode.jsGoogle Chrome 的 JS 引擎。為了理解這些對解析友好的優化方法,我們還得先討論 JavaScript 的解析過程,在深入理解代碼解析過程的基礎上,再對三個編寫更高速 JavaScript 的技巧進行一一概述。

先簡單回顧一下 JavaScript 執行的三個階段。

  1.  從源代碼到語法樹 —— 解析器從源碼中生成一棵 抽象語法樹
  2.  從語法樹到字節碼 —— V8 的解釋器 Ignition 從語法樹中生成字節碼(在 2017 年之前 并沒有該步驟,具體可以看 這篇文章)。
  3.  從字節碼到機器碼 —— V8 的編譯器 TurboFan 從字節碼中生成圖,用高度優化的機器碼替代部分字節碼。

上述的第二和第三階段 涉及到了 JavaScript 的編譯。在這篇文章中,我們將重點介紹第一階段并解釋該階段對編寫高效 JavaScript 的影響。我們會按照從左到右、從上到下的順序介紹解析管道,該管道接受源代碼并生成一棵語法樹。

抽象語法樹(AST)。它是在解析器(圖中藍色部分)中創建的。

掃描器

源代碼首先被分解成 chunk,每個 chunk 都可能采用不同的編碼,稍后會有一個字符流將所有 chunk 的編碼統一為 UTF-16。

在解析之前,掃描器會將 UTF-16 字符流分解成 token。token 是一段腳本中具有語義的最小單元。有不同類型的 token,包括空白符(用于 自動插入分號)、標識符、關鍵字以及代理對(僅當代理對無法被識別為其它東西時才會結合成標識符)。這些 token 之后被送往預解析器中,接著再送往解析器。

預解析器

解析器的工作量是最少的,只要足夠跳過傳入的源代碼并進行懶解析(而不是全解析)即可。預解析器確保輸入的源代碼包含有效語法,并生成足夠的信息來正確地編譯外部函數。這個準備好的函數稍后將按需編譯。

解析

解析器接收到掃描器生成的 token 后,現在需要生成一個供編譯器使用的中間表示。

首先我們來討論解析樹。解析樹,或者說 具體語法樹(CST)將源語法表示為一棵樹。每個葉子節點都是一個 token,而每個中間節點則表示一個語法規則。在英語里,語法規指的是名詞、主語等,而在編程里,語法規則指的是一個表達式。不過,解析樹的大小隨著程序大小會增長得很快。

相反,抽象語法樹 要更加簡潔。每個中間節點表示一個結構,比如一個減法運算(-),并且這棵樹并沒有展示源代碼的所有細節。例如,由括號定義的分組是蘊含在樹的結構中的。另外,標點符號、分隔符以及空白符都被省略了。你可以在 這里 了解更多 AST 和 CST 的區別。

接下來我們將重點放在 AST 上。以下面用 JavaScript 編寫的斐波那契程序為例: 

  1. function fib(n) {   
  2.   if (n <= 1) return n;   
  3.   return fib(n-1) + fib(n-2);   
  4.   } 

下面的 JSON 文件就是對應的抽象語法

了。這是用 AST Explorer 生成的。(如果你不熟悉這個,可以點擊這里來詳細了解 如何閱讀 JSON 格式的 AST)。 

  1.  
  2.   "type": "Program",  
  3.   "start": 0,  
  4.   "end": 73,  
  5.   "body": [  
  6.     {  
  7.       "type": "FunctionDeclaration",  
  8.       "start": 0,  
  9.       "end": 73,  
  10.       "id": {  
  11.         "type": "Identifier",  
  12.         "start": 9,  
  13.         "end": 12,  
  14.         "name": "fib"  
  15.       },  
  16.       "expression": false,  
  17.       "generator": false,  
  18.       "async": false,  
  19.       "params": [  
  20.         {  
  21.           "type": "Identifier",  
  22.           "start": 13,  
  23.           "end": 14,  
  24.           "name": "n"  
  25.         }  
  26.       ],  
  27.       "body": {  
  28.         "type": "BlockStatement",  
  29.         "start": 16,  
  30.         "end": 73,  
  31.         "body": [  
  32.           {  
  33.             "type": "IfStatement",  
  34.             "start": 20,  
  35.             "end": 41,  
  36.             "test": {  
  37.               "type": "BinaryExpression",  
  38.               "start": 24,  
  39.               "end": 30,  
  40.               "left": {  
  41.                 "type": "Identifier",  
  42.                 "start": 24,  
  43.                 "end": 25,  
  44.                 "name": "n"  
  45.               },  
  46.               "operator": "<=",  
  47.               "right": {  
  48.                 "type": "Literal",  
  49.                 "start": 29,  
  50.                 "end": 30,  
  51.                 "value": 1,  
  52.                 "raw": "1"  
  53.               }  
  54.             },  
  55.             "consequent": {  
  56.               "type": "ReturnStatement",  
  57.               "start": 32,  
  58.               "end": 41,  
  59.               "argument": {  
  60.                 "type": "Identifier",  
  61.                 "start": 39,  
  62.                 "end": 40,  
  63.                 "name": "n"  
  64.               }  
  65.             },  
  66.             "alternate": null  
  67.           },  
  68.           {  
  69.             "type": "ReturnStatement",  
  70.             "start": 44,  
  71.             "end": 71,  
  72.             "argument": {  
  73.               "type": "BinaryExpression",  
  74.               "start": 51,  
  75.               "end": 70,  
  76.               "left": {  
  77.                 "type": "CallExpression",  
  78.                 "start": 51,  
  79.                 "end": 59,  
  80.                 "callee": {  
  81.                   "type": "Identifier",  
  82.                   "start": 51,  
  83.                   "end": 54,  
  84.                   "name": "fib"  
  85.                 },  
  86.                 "arguments": [  
  87.                   {  
  88.                     "type": "BinaryExpression",  
  89.                     "start": 55,  
  90.                     "end": 58,  
  91.                     "left": {  
  92.                       "type": "Identifier",  
  93.                       "start": 55,  
  94.                       "end": 56,  
  95.                       "name": "n"  
  96.                     },  
  97.                     "operator": "-",  
  98.                     "right": {  
  99.                       "type": "Literal",  
  100.                       "start": 57,  
  101.                       "end": 58,  
  102.                       "value": 1,  
  103.                       "raw": "1"  
  104.                     }  
  105.                   }  
  106.                 ]  
  107.               },  
  108.               "operator": "+",  
  109.               "right": {  
  110.                 "type": "CallExpression",  
  111.                 "start": 62,  
  112.                 "end": 70,  
  113.                 "callee": {  
  114.                   "type": "Identifier",  
  115.                   "start": 62,  
  116.                   "end": 65,  
  117.                   "name": "fib"  
  118.                 },  
  119.                 "arguments": [  
  120.                   {  
  121.                     "type": "BinaryExpression",  
  122.                     "start": 66,  
  123.                     "end": 69,  
  124.                     "left": {  
  125.                       "type": "Identifier",  
  126.                       "start": 66,  
  127.                       "end": 67,  
  128.                       "name": "n"  
  129.                     },  
  130.                     "operator": "-",  
  131.                     "right": {  
  132.                       "type": "Literal",  
  133.                       "start": 68,  
  134.                       "end": 69,  
  135.                       "value": 2,  
  136.                       "raw": "2"  
  137.                     }  
  138.                   }  
  139.                 ]  
  140.               }  
  141.             }  
  142.           }  
  143.         ]  
  144.       }  
  145.     }  
  146.   ],  
  147.   "sourceType": "module"  
  148.  
  149. (來源:GitHub) 

上面代碼的要點是,每個非葉子節點都是一個運算符,而每個葉子節點都是操作數。這棵語法樹稍后將作為輸入傳給 JavaScript 接著要執行的兩個階段。

三個技巧優化你的 JavaScript

下面羅列的技巧清單中,我會省略那些已經廣泛使用的技巧,例如縮減代碼來最大化信息密度,從而使掃描器更具有時效性。另外,我也會跳過那些適用范圍很小的建議,例如避免使用非 ASCII 字符。

提高解析性能的方法數不勝數,讓我們著眼于其中適用范圍最廣泛的方法吧。

1.盡可能遵從工作線程

主線程被阻塞會導致用戶交互的延遲,所以應該盡可能減少主線程上的工作。關鍵就是要識別并避免會導致主線程中某些任務長時間運行的解析行為。

這種啟發式超出了解析器的優化范圍。例如,用戶控制的 JavaScript 代碼段可以使用 web workers 達到相同的效果。你可以閱讀 實時處理應用在 angular 中使用 web workers 來了解更多信息。

避免使用大量的內聯腳本

內聯腳本是在主線程中處理的,根據之前的說法,應該盡量避免這樣做。事實上,除了異步和延遲加載之外,任何 JavaScript 的加載都會阻塞主線程。

避免嵌套外層函數

懶編譯也是發生在主線程上的。不過,如果處理得當的話,懶解析可以加快啟動速度。想要強制進行全解析的話,可以使用諸如 optimize.js(已經不維護)這樣的工具來決定進行全解析或者懶解析。

分解超過 100kB 的文件

將大文件分解成小文件以最大化并行腳本的加載速度。“2019 年 JavaScript 的性能開銷”一文比較了 Facebook 網站和 Reddit 網站的文件大小。前者通過在 300 多個請求中拆分大約 6MB 的 JavaScript ,成功將解析和編譯工作在主線程上的占比控制到 30%;相反,Reddit 的主線程上進行解析和編譯工作的達到了將近 80%。

2. 使用 JSON 而不是對象字面量 —— 偶爾

在 JavaScript 中,解析 JSON 比解析對象字面量來得更加高效。 parsing benchmark 已經證實了這一點。在不同的主流 JavaScript 執行引擎中分別解析一個 8MB 大小的文件,前者的解析速度最高可以提升 2 倍。

2019 年谷歌開發者大會 也討論過 JSON 解析如此高效的兩個原因:

  1.  JSON 是單字符串 token,而對象字面量可能包含大量的嵌套對象和 token;
  2.  語法對上下文是敏感的。解析器逐字檢查源代碼,并不知道某個代碼塊是一個對象字面量。而左大括號不僅可以表明它是一個對象字面量,還可以表明它是一個解構對象或者箭頭函數。

不過,值得注意的是,JSON.parse 同樣會阻塞主線程。對于超過 1MB 的文件,可以使用 FlatBuffers 提高解析效率

3. 最大化代碼緩存

最后,你可以通過完全規避解析來提高解析效率。對于服務端編譯來說, WebAssembly (WASM) 是個不錯的選擇。然而,它沒辦法替代 JavaScript。對于 JS,更合適的方法是最大化代碼緩存。

值得注意的是,緩存并不是任何時候都生效的。在執行結束之前編譯的任何代碼都會被緩存 —— 這意味著處理器、監聽器等不會被緩存。為了最大化代碼緩存,你必須最大化執行結束之前編譯的代碼數量。其中一個方法就是使用立即執行函數(IIFE)啟發式:解析器會通過啟發式的方法標識出這些 IIFE 函數,它們會在稍后立即被編譯。因此,使用啟發式的方法可以確保一個函數在腳本執行結束之前被編譯。

此外,緩存是基于單個腳本執行的。這意味著更新腳本將會使緩存失效。V8 團隊建議可以分割腳本或者合并腳本,從而實現代碼緩存。但是,這兩個建議是互相矛盾的。你可以閱讀“JavaScript 開發中的代碼緩存”來了解更多代碼緩存相關的信息。

結論

解析時間的優化涉及到工作線程的延遲解析以及通過最大化緩存來避免完全解析。理解了 V8 的解析機制后,我們也能推斷出上面沒有提到的其它優化方法。

下面給出了更多了解解析機制的資源,這個機制通常來說同時適用于 V8 和 JavaScript 的解析。

額外小貼士:理解 JavaScript 的錯誤和性能是如何影響你的用戶的。

跟蹤生產過程中 JavaScript 的異常或者錯誤是很耗時的,而且也很令人傷腦筋。如果你有興趣監控 JavaScript 的錯誤和應用性能是如何對用戶造成影響的,可以嘗試使用 LogRocket。

LogRocket 就像是為 web 應用量身訂造的 DVR(錄像機),它可以確切地記錄你的網站上發生的所有事情。LogRocket 可以幫助你統計并報告錯誤,以查看錯誤發生的頻率以及它們對你的用戶群的影響程度。你可以輕松地重現錯誤發生時特定的用戶會話,以查看是用戶的哪些操作導致了 bug。

LogRocket 可以記錄你的 app 上的請求和響應(包含 header 和 body)以及用戶相關的上下文信息,從而窺探問題全貌。它也可以記錄頁面的 HTML 和 CSS,即使是面對最復雜的單頁面應用,也可以重構出像素完美級別的視頻。

如果你想提高你的 JavaScript 錯誤監控能力,LogRocket 是個不錯的選擇。 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2019-12-06 10:59:20

JavaScript運行引擎

2025-04-02 07:29:14

2011-07-11 15:36:44

JavaScript

2020-12-20 10:02:17

ContextReactrender

2009-11-13 10:48:47

網絡配置DNS

2009-11-13 13:48:58

網絡配置DNS

2010-05-20 18:40:33

IIS服務器

2015-03-10 13:55:31

JavaScript預解析原理及實現

2020-01-06 11:22:06

TCPLinux內核

2019-09-18 08:53:55

2011-12-19 09:23:50

UML建模

2011-04-28 16:36:17

投影機

2025-01-10 11:28:58

2010-03-15 14:01:26

JavaScript

2020-08-13 11:24:45

Java技術開發

2024-07-07 21:49:22

2011-06-16 14:38:18

JavaScript事件委托

2025-05-13 08:25:00

模塊化編程JavaScript

2024-06-27 11:22:34

點贊
收藏

51CTO技術棧公眾號

p色视频免费在线观看| 国产毛片aaa| 国产精品99精品一区二区三区∴| 91麻豆精东视频| 日韩av不卡电影| 欧美激情aaa| 国产极品一区| 亚洲一卡二卡三卡四卡无卡久久| 国产一区二区在线观看免费播放| 51国产偷自视频区视频| 日韩在线精品| 精品国内二区三区| 大肉大捧一进一出好爽动态图| 福利片在线看| 国产一区二区看久久| 久久免费少妇高潮久久精品99| 深爱五月激情网| 国产成人77亚洲精品www| 亚洲精品成人a在线观看| 精品无码久久久久久久动漫| 中文字幕人妻丝袜乱一区三区| 亚洲理论电影网| 亚洲精品白浆高清久久久久久| 噼里啪啦国语在线观看免费版高清版| 超碰个人在线| 久久综合色之久久综合| 亚洲一区二区三区在线视频| 天天插天天操天天干| 99精品视频在线观看播放| 亚洲第一视频在线观看| 国产又黄又猛的视频| 日本在线啊啊| 亚洲男同性视频| 国产区一区二区三区| 一级特黄aaa大片| 国产精品美女久久久浪潮软件| 久久精品国产免费观看| 91精品人妻一区二区| 97久久精品| 欧美日韩国产免费一区二区| 亚洲美免无码中文字幕在线 | 亚洲免费激情| 久久精品中文字幕一区| 久久久视频6r| 亚洲+变态+欧美+另类+精品| 日韩三级av在线播放| 日韩精品你懂的| 欧美调教sm| 亚洲自拍另类综合| 99re99热| 中文字幕在线播放| 中文字幕乱码一区二区免费| 美脚丝袜一区二区三区在线观看| 亚洲精品国产一区二| 国产在线精品一区二区三区不卡| 国产精品久久久av| 欧美brazzers| 久久精品国产清高在天天线| 2018国产精品视频| 日韩黄色在线视频| 在线观看一区视频| 韩国美女主播一区| 精品久久免费视频| 亚洲国产日本| 午夜精品久久久久久久男人的天堂 | 国产系列在线观看| 久久亚区不卡日本| 欧美一级爱爱| 三级av在线| 久久影院视频免费| 欧美日韩综合网| 国产精品成人69xxx免费视频| 综合久久五月天| 精品一区二区三区香蕉蜜桃| 国产欧美一区二区精品婷婷| 成人av番号网| 91久久精品国产91性色69| 日本美女一区二区| 国产精品日韩av| 波多野结衣网站| 日本欧美加勒比视频| 国产精品91久久久久久| 中文字幕人妻一区二区三区视频| 蜜桃一区二区三区在线观看| 国产精品一香蕉国产线看观看| 中文字幕 视频一区| 久久99蜜桃精品| 亚洲精品免费av| a毛片在线免费观看| 成人综合婷婷国产精品久久| 精品国产乱码久久久久| 欧美视频免费一区二区三区| 国产欧美日本一区二区三区| 亚洲人成影视在线观看| 黄色网页在线免费看| 一级女性全黄久久生活片免费| 僵尸世界大战2 在线播放| 国产在线观看www| 欧美最猛性xxxxx直播| 国模私拍视频在线观看| 亚洲三级av| 国产视频久久久久| 国产精品suv一区二区88| 欧美日韩国产欧| 欧美一区二区色| 中文字幕 自拍偷拍| 国产精品亚洲成人| 欧美理论一区二区| 高清全集视频免费在线| 精品久久久久久中文字幕一区奶水| 国产成人无码一二三区视频| 精品69视频一区二区三区| 日韩欧美国产一区二区在线播放 | 黄瓜视频污在线观看| 日韩在线欧美| 91精品国产91| 一卡二卡在线视频| 99九九99九九九视频精品| 亚洲免费不卡| www.youjizz.com在线| 欧美三电影在线| 精品1卡二卡三卡四卡老狼| 日韩久久电影| 国产91ⅴ在线精品免费观看| 国产又大又黑又粗| 久久久久综合网| 久久综合久久久久| 久久亚洲精品人成综合网| 亚洲国产欧美一区| 麻豆天美蜜桃91| 久久综合影音| 国产女人水真多18毛片18精品| 色综合久久影院| 色综合久久综合网| 欧美夫妇交换xxx| 小处雏高清一区二区三区| 日韩免费高清在线观看| 视频一区二区免费| 一区二区三区精品| 亚洲精品永久视频| 综合色就爱涩涩涩综合婷婷| 久久久这里只有精品视频| 一区二区国产欧美| 国产欧美一区二区精品性色 | 人妻在线日韩免费视频| 欧美成人日本| 国产欧美韩国高清| av在线日韩国产精品| 欧美天堂在线观看| 久久久久9999| 亚洲日本免费| 国产91aaa| 性欧美高清come| 91精品免费在线观看| 国产国语性生话播放| 在线不卡欧美| 国产精品毛片一区视频| 污片在线免费观看| 日韩亚洲欧美在线| 欧美人禽zoz0强交| 国产老肥熟一区二区三区| 综合视频免费看| 视频欧美精品| 日韩在线观看av| 亚洲天堂777| 国产精品网曝门| 久久婷五月综合| 欧美国产小视频| 国产在线视频91| 成人在线免费电影| 欧美人体做爰大胆视频| 一级性生活免费视频| 国产美女主播视频一区| 在线免费观看成人| 精品精品视频| 欧美激情在线观看视频| 日本黄色免费视频| 欧美日韩国产综合视频在线观看中文| 添女人荫蒂视频| 日韩成人免费电影| 潘金莲一级淫片aaaaa免费看| 国产精品xnxxcom| 欧美激情xxxx| 四虎精品成人免费网站| 偷窥国产亚洲免费视频| 波多野结衣av在线观看| 日日夜夜精品免费视频| 一区二区三区不卡在线| 麻豆一二三区精品蜜桃| 97精品国产97久久久久久春色| 亚洲日本香蕉视频| 在线观看视频一区二区欧美日韩| 亚洲视频重口味| 国产精品一二二区| 欧美日韩性生活片| 欧美日韩精品在线一区| 99国产视频在线| 麻豆mv在线观看| 中文一区二区视频| 午夜精品久久久久久久第一页按摩| 亚洲图片自拍偷拍| 色噜噜日韩精品欧美一区二区| 麻豆精品蜜桃视频网站| 日本人妻伦在线中文字幕| 亚洲精华一区二区三区| 国产日韩欧美在线看| 国产福利在线免费观看| 亚洲色图校园春色| www.国产黄色| 91福利国产精品| 久久成人国产精品入口| 国产欧美一区二区三区鸳鸯浴| 亚洲av无码久久精品色欲| 久久国产主播| 久久福利一区二区| 欧美少妇性xxxx| 97久久人人超碰caoprom欧美| 国模冰冰炮一区二区| 欧美成年人在线观看| 黄色av免费在线观看| 日韩亚洲国产中文字幕欧美| 日韩熟女一区二区| 亚洲国产色一区| 婷婷丁香综合网| 91蜜桃婷婷狠狠久久综合9色| www.污污视频| 噜噜噜躁狠狠躁狠狠精品视频| 中文字幕第一页亚洲| 九色精品国产蝌蚪| 国产精品嫩草在线观看| 国产高清日韩| 国产狼人综合免费视频| 欧美激情20| 欧美极品少妇xxxxⅹ免费视频| 91caoporm在线视频| 亚洲欧美日韩成人| 少妇精品视频一区二区| 日韩女优av电影| 亚洲天堂男人网| 色欧美片视频在线观看在线视频| 69精品久久久| 一区二区三区视频在线看| 免费观看特级毛片| 国产视频一区在线观看| 波多野结衣影院| 粉嫩av亚洲一区二区图片| 超碰中文字幕在线观看| 精品一区二区三区免费| 日本免费色视频| 免费观看在线色综合| 蜜臀视频一区二区三区| 免费欧美日韩| 男人操女人免费软件| 一本色道精品久久一区二区三区 | eeuss影院www在线播放| 亚洲欧美制服另类日韩| 天堂av电影在线观看| 亚洲精品97久久| 色欲av永久无码精品无码蜜桃| 精品国产乱码久久久久久蜜臀| 午夜免费福利视频| 日韩精品最新网址| 亚洲经典一区二区三区| 日韩精品一区二区三区四区| 国产suv一区二区| 日韩午夜小视频| 亚洲国产精品无码久久| 精品福利一二区| 蜜桃在线一区二区| 日韩成人xxxx| 欧美高清电影在线| 亚洲天堂免费在线| 日本暖暖在线视频| 久久久精品影院| www.久久ai| 欧美激情视频在线观看| free性欧美| 欧美一级高清免费播放| 日本免费久久| 国产精品日韩电影| 国产人与zoxxxx另类91| 粉嫩av四季av绯色av第一区| 欧美三级电影在线| 久久久久久99| 色婷婷色综合| 国产精品无码电影在线观看| 亚洲高清久久| 精品www久久久久奶水| 日本视频中文字幕一区二区三区| 超碰人人草人人| 大白屁股一区二区视频| 永久免费成人代码| 1区2区3区精品视频| 欧美精品99久久久| 色综合久久久久久久久| 亚洲图片视频小说| 亚洲成人激情在线| 国产视频三级在线观看播放| 日韩一区二区欧美| 爱草tv视频在线观看992| 国产精品成人一区二区| 精品一区91| 欧美日韩精品免费观看| 婷婷亚洲五月| 青青草国产精品视频| 日产欧产美韩系列久久99| 国产又黄又嫩又滑又白| 久久久久99精品国产片| 波多野结衣亚洲一区二区| 天天影视网天天综合色在线播放| 中文字幕你懂的| 亚洲精品xxx| 高h视频在线观看| 日韩av免费在线| 午夜日韩影院| 亚洲成人自拍| 亚洲国产精品一区制服丝袜| 色噜噜狠狠一区二区| 97久久超碰精品国产| 色欲一区二区三区精品a片| 色婷婷综合久久久| 蜜桃视频污在线观看| 久久精品免费电影| 成人自拍av| 精品在线视频一区二区| 欧美永久精品| 欧美婷婷精品激情| 97久久超碰国产精品| 免费中文字幕在线观看| 欧美日韩国产色站一区二区三区| 四虎影院在线播放| 国内久久久精品| 精品国产不卡一区二区| 亚洲国产日韩综合一区| 久久精品系列| 波多野结衣视频播放| 亚洲精品免费一二三区| 亚洲天堂777| 中文字幕亚洲综合久久筱田步美| 黄毛片在线观看| 国产女主播一区二区三区| 伊人久久大香线| 久久精品亚洲天堂| 亚洲欧洲一区二区三区| www.久久视频| 亚洲人午夜精品| 中文不卡1区2区3区| 国产欧美日韩一区二区三区| 欧美精品观看| 无套白嫩进入乌克兰美女| 日韩理论片网站| 国产精品久久久久久久久久久久久久久久 | 欧美91福利在线观看| 九九热免费在线观看| 国产精品欧美精品| 中文字幕精品一区二区精| 国产亚洲精品一区二区| 国产精品极品美女在线观看| 欧美一区二区视频17c| 乱人伦精品视频在线观看| 波多野结衣办公室33分钟| 色综合天天性综合| 免费一级毛片在线观看| 日韩av手机在线| 久久99影视| 国产精品人人妻人人爽人人牛| 久久女同性恋中文字幕| 免费看毛片网站| 亚洲欧美自拍一区| 日本精品裸体写真集在线观看| 奇米精品在线| 全部av―极品视觉盛宴亚洲| 色www亚洲国产阿娇yao| 7777精品伊人久久久大香线蕉| 九义人在线观看完整免费版电视剧| 亚洲a区在线视频| 欧美片第1页综合| 国产精品麻豆入口| 91极品美女在线| 日本www在线观看视频| 97视频中文字幕| 妖精视频成人观看www| 一卡二卡三卡四卡| 欧美精选一区二区| 青春草在线视频| 欧美不卡三区| 奇米亚洲午夜久久精品| 看免费黄色录像| 亚洲精品一区二区三区在线观看| 在线女人免费视频| 亚洲精品久久区二区三区蜜桃臀 | 久久久国产午夜精品| 亚洲天堂网视频| 久久久久亚洲精品| 奇米色欧美一区二区三区| 在线视频一二区| 激情av一区二区| 日本在线免费| 精品蜜桃一区二区三区| 久久国产欧美日韩精品|