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

當前 WebAssembly 的狀況

開發 開發工具
這篇文章介紹WebAssembly 工作原理以及為什么 WebAssembly 運行的更快。

上一篇文章《關于WebAssembly 的背景知識》讓大家基本了解了 WebAssembly ,接下來我們繼續介紹WebAssembly 工作原理以及為什么 WebAssembly 運行的更快。

一、WebAssembly 工作原理

WebAssembly 是除了 JavaScript 以外,另一種可以在網頁中運行的編程語言。過去如果你想在瀏覽器中運行代碼來對網頁中各種元素進行控制,只有 JavaScript 這一種選擇。

所以當人們談論 WebAssembly 的時候,往往會拿 JavaScript 來進行比較。但是它們其實并不是“二選一”的關系——并不是只能用 WebAssembly 或者 JavaScript。

實際上,我們鼓勵開發者將這兩種語言一起使用,即使你不親自實現 WebAssembly 模塊,你也可以學習它現有的模塊,并它的優勢來實現你的功能。

WebAssembly 模塊定義的一些功能可以通過 JavaScript 來調用。所以就像你通過 npm 下載 lodash 模塊并通過 API 使用它一樣,未來你也可以下載 WebAssembly 模塊并且使用其提供的功能。

那么,就讓我們來看一下如何開發 WebAssembly 模塊,以及如何通過 JavaScript 使用他們。

1. WebAssembly 處于哪個環節?

上一篇關于WebAssembly 背景知識的文章中,我介紹了編譯器是如何從高級語言翻譯到機器碼的。

那么在上圖中,WebAssembly 在什么位置呢?實際上,你可以把它看成另一種“目標匯編語言”。

每一種目標匯編語言(x86、ARM)都依賴于特定的機器結構。當你想要把你的代碼放到用戶的機器上執行的時候,你并不知道目標機器結構是什么樣的。

而 WebAssembly 與其他的匯編語言不一樣,它不依賴于具體的物理機器。可以抽象地理解成它是概念機器的機器語言,而不是實際的物理機器的機器語言。

正因為如此,WebAssembly 指令有時也被稱為虛擬指令。它比 JavaScript 代碼更直接地映射到機器碼,它也代表了“如何能在通用的硬件上更有效地執行代碼”的一種理念。所以它并不直接映射成特定硬件的機器碼。

WebAssembly 指令有時也被稱為虛擬指令

瀏覽器把 WebAssembly 下載下來后,可以迅速地將其轉換成機器匯編代碼。

2. 編譯到 .wasm 文件

目前對于 WebAssembly 支持情況***的編譯器工具鏈是 LLVM。有很多不同的前端和后端插件可以用在 LLVM 上。

提示:很多 WebAssembly 開發者用 C 語言或者 Rust 開發,再編譯成 WebAssembly。其實還有其他的方式來開發 WebAssembly 模塊。例如利用 TypeScript 開發 WebAssembly 模塊,或者直接用文本格式的 WebAssembly 也可以。

假設想從 C 語言到 WebAssembly,我們就需要 clang 前端來把 C 代碼變成 LLVM 中間代碼。當變換成了 LLVM IR 時,說明 LLVM 已經理解了代碼,它會對代碼自動地做一些優化。

為了從 LLVM IR 生成 WebAssembly,還需要后端編譯器。在 LLVM 的工程中有正在開發中的后端,而且應該很快就開發完成了,現在這個時間節點,暫時還看不到它是如何起作用的。

還有一個易用的工具,叫做 Emscripten。它通過自己的后端先把代碼轉換成自己的中間代碼(叫做 asm.js),然后再轉化成 WebAssembly。實際上它背后也是使用的 LLVM。

Emscripten 還包含了許多額外的工具和庫來包容整個 C/C++ 代碼庫,所以它更像是一個軟件開發者工具包(SDK)而不是編譯器。例如系統開發者需要文件系統以對文件進行讀寫,Emscripten 就有一個 IndexedDB 來模擬文件系統。

不考慮太多的這些工具鏈,只要知道最終生成了 .wasm 文件就可以了。后面我會介紹 .wasm 文件的結構,在這之前先一起了解一下在 JS 中如何使用它。

3. 加載一個 .wasm 模塊到 JavaScript

.wasm 文件是 WebAssembly 模塊,它可以加載到 JavaScript 中使用,現階段加載的過程稍微有點復雜。

  1. function fetchAndInstantiate(url, importObject) { 
  2.   return fetch(url).then(response => 
  3.     response.arrayBuffer() 
  4.   ).then(bytes => 
  5.     WebAssembly.instantiate(bytes, importObject) 
  6.   ).then(results => 
  7.     results.instance 
  8.   ); 

如果想深入了解,可以在 MDN 文檔中了解更多。

我們一直在致力于把這一過程變得簡單,對工具鏈進行優化。希望能夠把它整合到現有的模塊打包工具中,比如 webpack 中,或者整合到加載器中,比如 SystemJS 中。我們相信加載 WebAssembly 模塊也可以像加載 JavaScript 一樣簡單。

這里介紹 WebAssembly 模塊和 JavaScript 模塊的主要區別。當前的 WebAssembly 只能使用數字(整型或者浮點型)作為參數或者返回值。

對于任何其他的復雜類型,比如 string,就必須得用 WebAssembly 模塊的內存操作了。如果是經常使用 JavaScript,對直接操作內存不是很熟悉的話,可以回想一下 C、C++ 和 Rust 這些語言,它們都是手動操作內存。WebAssembly 的內存操作和這些語言的內存操作很像。

為了實現這個功能,它使用了 JavaScript 中稱為 ArrayBuffer 的數據結構。ArrayBuffer 是一個字節數組,所以它的索引(index)就相當于內存地址了。

如果你想在 JavaScript 和 WebAssembly 之間傳遞字符串,可以利用 ArrayBuffer 將其寫入內存中,這時候 ArrayBuffer 的索引就是整型了,可以把它傳遞給 WebAssembly 函數。此時,***個字符的索引就可以當做指針來使用。

這就好像一個 web 開發者在開發 WebAssembly 模塊時,把這個模塊包裝了一層外衣。這樣其他使用者在使用這個模塊的時候,就不用關心內存管理的細節。

如果你想了解更多的內存管理,看一下我們寫的 WebAssembly 的內存操作。

4. .wasm 文件結構

如果你是寫高級語言的開發者,并且通過編譯器編譯成 WebAssembly,那你不用關心 WebAssembly 模塊的結構。但是了解它的結構有助于你理解一些基本問題。

如果你對編譯器還不了解,建議先讀一下“系列三之編譯器如何生成匯編這篇文章。

這段代碼是即將生成 WebAssembly 的 C 代碼:

  1. int add42(int num) { 
  2.     return num + 42; 

你可以使用 WASM Explorer 來編譯這個函數。

打開 .wasm 文件(假設你的編輯器支持的話),可以看到下面代碼:

  1. 00 61 73 6D 0D 00 00 00 01 86 80 80 80 00 01 60 
  2. 01 7F 01 7F 03 82 80 80 80 00 01 00 04 84 80 80 
  3. 80 00 01 70 00 00 05 83 80 80 80 00 01 00 01 06 
  4. 81 80 80 80 00 00 07 96 80 80 80 00 02 06 6D 65 
  5. 6D 6F 72 79 02 00 09 5F *** 35 61 64 64 34 32 69 
  6. 00 00 0A 8D 80 80 80 00 01 87 80 80 80 00 00 20 
  7. 00 41 2A 6A 0B 

這是模塊的“二進制”表示。之所以用引號把“二進制”引起來,是因為上面其實是用十六進制表示的,不過把它變成二進制或者人們能看懂的十進制表示也很容易。

例如,下面是 num + 42 的各種表示方法。

5. 代碼是如何工作的:基于棧的虛擬機

如果你對具體的操作過程很好奇,那么這幅圖可以告訴你指令都做了什么。

從圖中我們可以注意到 加 操作并沒有指定哪兩個數字進行加。這是因為 WebAssembly 是采用“基于棧的虛擬機”的機制。即一個操作符所需要的所有值,在操作進行之前都已經存放在堆棧中。

所有的操作符,比如加法,都知道自己需要多少個值。加需要兩個值,所以它從堆棧頂部取兩個值就可以了。那么加指令就可以變的更短(單字節),因為指令不需要指定源寄存器和目的寄存器。這也使得 .wasm 文件變得更小,進而使得加載 .wasm 文件更快。

盡管 WebAssembly 使用基于棧的虛擬機,但是并不是說在實際的物理機器上它就是這么生效的。當瀏覽器翻譯 WebAssembly 到機器碼時,瀏覽器會使用寄存器,而 WebAssembly 代碼并不指定用哪些寄存器,這樣做的好處是給瀏覽器***的自由度,讓其自己來進行寄存器的***分配。

6. WebAssembly 模塊的組成部分

除了上面介紹的,.wasm 文件還有其他部分。一些組成部分對于模塊來講是必須的,一些是可選的。

必須部分:

  • Type。在模塊中定義的函數的函數聲明和所有引入函數的函數聲明。
  • Function。給出模塊中每個函數一個索引。
  • Code。模塊中每個函數的實際函數體。

可選部分:

  • Export。使函數、內存、表(tables)、全局變量等對其他 WebAssembly 或 JavaScript 可見,允許動態鏈接一些分開編譯的組件,即 .dll 的WebAssembly 版本。
  • Import。允許從其他 WebAssembly 或者 JavaScript 中導入指定的函數、內存、表或者全局變量。
  • Start。當 WebAssembly 模塊加載進來的時候,可以自動運行的函數(類似于 main 函數)。
  • Global。聲明模塊的全局變量。
  • Memory。定義模塊用到的內存。
  • Table。使得可以映射到 WebAssembly 模塊以外的值,如映射到 JavaScript 的對象。這在間接函數調用時很有用。
  • Data。初始化導入的或者局部內存。
  • Element。初始化導入的或者局部的表。

如果你想了解關于這些組成部分的更深入的內容,可以閱讀這些組成部分的工作原理。

二、為什么 WebAssembly 更快?

上面我介紹了如何編寫 WebAssembly 程序,也表達了我希望看到更多的開發者在自己的工程中同時使用 WebAssembly 和 JavaScript 的期許。

開發者們不必糾結于到底選擇 WebAssembly 還是 JavaScript,已經有了 JavaScript 工程的開發者們,希望能把部分 JavaScript 替換成 WebAssembly 來嘗試使用。

例如,正在開發 React 程序的團隊可以把協調性代碼(即虛擬 DOM)替換成 WebAssembly 的版本。而對于你的 web 應用的用戶來說,他們就跟以前一樣使用,不會發生任何變化,同時他們還能享受到 WebAssembly 所帶來的好處——快。

而開發者們選擇替換為 WebAssembly 的原因正是因為 WebAssembly 比較快。

1. 當前的 JavaScript 性能如何?

在我們了解 JavaScript 和 WebAssembly 的性能區別之前,需要先理解 JS 引擎的工作原理。

下面這張圖片介紹了性能使用的大概分布情況。

JS 引擎在圖中各個部分所花的時間取決于頁面所用的 JavaScript 代碼。圖表中的比例并不代表真實情況下的確切比例情況。

JS 引擎

圖中的每一個顏色條都代表了不同的任務:

  • Parsing——表示把源代碼變成解釋器可以運行的代碼所花的時間;
  • Compiling + optimizing——表示基線編譯器和優化編譯器花的時間。一些優化編譯器的工作并不在主線程運行,不包含在這里。
  • Re-optimizing——當 JIT 發現優化假設錯誤,丟棄優化代碼所花的時間。包括重優化的時間、拋棄并返回到基線編譯器的時間。
  • Execution——執行代碼的時間
  • Garbage collection——垃圾回收,清理內存的時間

這里注意:這些任務并不是離散執行的,或者按固定順序依次執行的。而是交叉執行,比如正在進行解析過程時,其他一些代碼正在運行,而另一些正在編譯。

這樣的交叉執行給早期 JavaScript 帶來了很大的效率提升,早期的 JavaScript 執行類似于下圖,各個過程順序進行:

早期的 JavaScript 執行類似于下圖

早期時,JavaScript 只有解釋器,執行起來非常慢。當引入了 JIT 后,大大提升了執行效率,縮短了執行時間。

JIT 所付出的開銷是對代碼的監視和編譯時間。JavaScript 開發者可以像以前那樣開發 JavaScript 程序,而同樣的程序,解析和編譯的時間也大大縮短。這就使得開發者們更加傾向于開發更復雜的 JavaScript 應用。

同時,這也說明了執行效率上還有很大的提升空間。

2. WebAssembly 對比

下面是 WebAssembly 和典型的 web 應用的近似對比圖:

各種瀏覽器處理上圖中不同的過程,有著細微的差別,拿 SpiderMonkey 作為例子。

3. 文件獲取

這一步并沒有顯示在圖表中,但是這看似簡單地從服務器獲取文件這個步驟,卻會花費很長時間。

WebAssembly 比 JavaScript 的壓縮率更高,所以文件獲取也更快。即便通過壓縮算法可以顯著地減小 JavaScript 的包大小,但是壓縮后的 WebAssembly 的二進制代碼依然更小。

這就是說在服務器和客戶端之間傳輸文件更快,尤其在網絡不好的情況下。

4. 解析

當到達瀏覽器時,JavaScript 源代碼就被解析成了抽象語法樹。

瀏覽器采用懶加載的方式進行,只解析真正需要的部分,而對于瀏覽器暫時不需要的函數只保留它的樁(stub,譯者注:關于樁的解釋可以在之前的文章中有提及)。

解析過后 AST (抽象語法樹)就變成了中間代碼(叫做字節碼),提供給 JS 引擎編譯。

而 WebAssembly 則不需要這種轉換,因為它本身就是中間代碼。它要做的只是解碼并且檢查確認代碼沒有錯誤就可以了。

5. 編譯和優化

在關于 JIT 的文章中,我有介紹過,JavaScript 是在代碼的執行階段編譯的。因為它是弱類型語言,當變量類型發生變化時,同樣的代碼會被編譯成不同版本。

不同瀏覽器處理 WebAssembly 的編譯過程也不同,有些瀏覽器只對 WebAssembly 做基線編譯,而另一些瀏覽器用 JIT 來編譯。

不論哪種方式,WebAssembly 都更貼近機器碼,所以它更快,使它更快的原因有幾個:

在編譯優化代碼之前,它不需要提前運行代碼以知道變量都是什么類型。

編譯器不需要對同樣的代碼做不同版本的編譯。

很多優化在 LLVM 階段就已經做完了,所以在編譯和優化的時候沒有太多的優化需要做。

編譯和優化

6. 重優化

有些情況下,JIT 會反復地進行“拋棄優化代碼<->重優化”過程。

當 JIT 在優化假設階段做的假設,執行階段發現是不正確的時候,就會發生這種情況。比如當循環中發現本次循環所使用的變量類型和上次循環的類型不一樣,或者原型鏈中插入了新的函數,都會使 JIT 拋棄已優化的代碼。

反優化過程有兩部分開銷。***,需要花時間丟掉已優化的代碼并且回到基線版本。第二,如果函數依舊頻繁被調用,JIT 可能會再次把它發送到優化編譯器,又做一次優化編譯,這是在做無用功。

在 WebAssembly 中,類型都是確定了的,所以 JIT 不需要根據變量的類型做優化假設。也就是說 WebAssembly 沒有重優化階段。

重優化

7. 執行

自己也可以寫出執行效率很高的 JavaScript 代碼。你需要了解 JIT 的優化機制,例如你要知道什么樣的代碼編譯器會對其進行特殊處理(JIT 文章里面有提到過)。

然而大多數的開發者是不知道 JIT 內部的實現機制的。即使開發者知道 JIT 的內部機制,也很難寫出符合 JIT 標準的代碼,因為人們通常為了代碼可讀性更好而使用的編碼模式,恰恰不合適編譯器對代碼的優化。

加之 JIT 會針對不同的瀏覽器做不同的優化,所以對于一個瀏覽器優化的比較好,很可能在另外一個瀏覽器上執行效率就比較差。

正是因為這樣,執行 WebAssembly 通常會比較快,很多 JIT 為 JavaScript 所做的優化在 WebAssembly 并不需要。另外,WebAssembly 就是為了編譯器而設計的,開發人員不直接對其進行編程,這樣就使得 WebAssembly 專注于提供更加理想的指令(執行效率更高的指令)給機器就好了。

執行效率方面,不同的代碼功能有不同的效果,一般來講執行效率會提高 10% - 800%。

執行

8. 垃圾回收

JavaScript 中,開發者不需要手動清理內存中不用的變量。JS 引擎會自動地做這件事情,這個過程叫做垃圾回收。

可是,當你想要實現性能可控,垃圾回收可能就是個問題了。垃圾回收器會自動開始,這是不受你控制的,所以很有可能它會在一個不合適的時機啟動。目前的大多數瀏覽器已經能給垃圾回收安排一個合理的啟動時間,不過這還是會增加代碼執行的開銷。

目前為止,WebAssembly 不支持垃圾回收。內存操作都是手動控制的(像 C、C++一樣)。這對于開發者來講確實增加了些開發成本,不過這也使代碼的執行效率更高。

WebAssembly 不支持垃圾回收

9. 總結

WebAssembly 比 JavaScript 執行更快是因為:

  • 文件抓取階段,WebAssembly 比 JavaScript 抓取文件更快。即使 JavaScript 進行了壓縮,WebAssembly 文件的體積也比 JavaScript 更小;
  • 解析階段,WebAssembly 的解碼時間比 JavaScript 的解析時間更短;
  • 編譯和優化階段,WebAssembly 更具優勢,因為 WebAssembly 的代碼更接近機器碼,而 JavaScript 要先通過服務器端進行代碼優化。
  • 重優化階段,WebAssembly 不會發生重優化現象。而 JS 引擎的優化假設則可能會發生“拋棄優化代碼<->重優化”現象。
  • 執行階段,WebAssembly 更快是因為開發人員不需要懂太多的編譯器技巧,而這在 JavaScript 中是需要的。WebAssembly 代碼也更適合生成機器執行效率更高的指令。
  • 垃圾回收階段,WebAssembly 垃圾回收都是手動控制的,效率比自動回收更高。

這就是為什么在大多數情況下,同一個任務 WebAssembly 比 JavaScript 表現更好的原因。

但是,還有一些情況 WebAssembly 表現的會不如預期;同時 WebAssembly 的未來也會朝著使 WebAssembly 執行效率更高的方向發展。這些我會在下一篇文章《WebAssembly 的現在與未來》中介紹。

點擊《WebAssembly 系列(四)WebAssembly 工作原理》《WebAssembly 系列(五)為什么 WebAssembly 更快?》閱讀原文。

【本文是51CTO專欄作者“胡子大哈”的原創文章,轉載請聯系作者本人獲取授權】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2012-04-20 13:27:17

NFC

2024-04-16 00:13:52

JS網絡狀態ts類

2025-07-14 01:15:00

2017-03-19 22:43:12

WebAssemblyJavaScript編程

2022-08-15 06:00:00

二進制編程語言

2023-05-05 17:20:04

2021-06-11 09:00:00

語言WebWebAssembly

2023-03-27 13:25:18

WebAssembl語言Scheme

2020-11-03 08:12:20

WebAssemblyAPI

2022-05-16 10:25:03

Web內部垃圾收集安全性

2018-10-15 17:31:00

網絡安全病毒網絡攻擊

2023-01-31 09:02:24

JSVMVR

2011-08-22 16:39:15

iOS內存

2022-06-02 08:01:11

云原生工具

2022-10-28 16:57:18

DockerWasm

2023-12-10 16:48:00

Wasm瀏覽器

2022-06-22 10:04:29

JavaScriptRust語言

2022-01-16 20:25:57

WebAssembly網絡

2018-07-30 13:29:04

WebAssemblyGo語言

2017-03-19 20:41:57

WebAssemblyJavaScript編程
點贊
收藏

51CTO技術棧公眾號

亚洲永久无码7777kkk| 亚洲激情免费视频| 91亚洲精品国偷拍自产在线观看| 国产精品久久天天影视| 欧美一区二视频| 中文字幕无码精品亚洲资源网久久| 天堂中文在线8| 看国产成人h片视频| 欧美肥婆姓交大片| jizz中文字幕| 成人精品毛片| 欧美日韩国产天堂| 美脚丝袜脚交一区二区| 婷婷激情在线| 91丨porny丨国产| 91久久久久久久一区二区| 久久高清免费视频| 我不卡影院28| 一个人看的www久久| 91蝌蚪视频在线| 欧美xx视频| 亚洲高清在线精品| 中文字幕一区二区三区在线乱码| 视频在线观看你懂的| 国产精品夜夜嗨| 国产精品自拍偷拍| 在线观看日本网站| 99精品久久久| 欧美精品日韩三级| 性生交大片免费全黄| 亚洲欧美成人vr| 亚洲精品mp4| 黄页网站在线看| 小明成人免费视频一区| 狠狠躁夜夜躁人人爽天天天天97 | 久久a爱视频| 欧美一区二区二区| 国产原创精品在线| 欧美日韩视频网站| 日韩欧美精品免费在线| 草b视频在线观看| 狂野欧美激情性xxxx欧美| 亚洲欧美在线观看| 蜜桃av噜噜一区二区三| 狠狠躁日日躁夜夜躁av| 国产精品888| 亚洲中国色老太| 99热这里只有精品99| 精品写真视频在线观看| 91精品国产综合久久久久久蜜臀 | 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 永久看看免费大片| 99热这里有精品| 欧美一区午夜视频在线观看| 爱豆国产剧免费观看大全剧苏畅| 国产成人免费精品| 91国产免费看| 天天干天天操天天玩| 嫩草伊人久久精品少妇av杨幂| 色视频一区二区| 午夜精品在线免费观看| 成人国产网站| 在线播放国产精品二区一二区四区| 久热精品在线播放| 国产精品日韩精品在线播放| 91麻豆精品国产自产在线| 久国产精品视频| 日本亚州欧洲精品不卡| 精品国产一区a| 国产老熟女伦老熟妇露脸| 日本成人7777| 亚洲午夜未满十八勿入免费观看全集 | 中文在线资源观看视频网站免费不卡| 成人免费视频入口| 夜间精品视频| 97在线视频一区| 加勒比在线一区| 六月婷婷色综合| 成人av网站观看| 五月婷婷久久久| 中文字幕乱码久久午夜不卡 | 蜜桃久久久久久| 97免费高清电视剧观看| 亚洲人视频在线观看| 国产欧美一二三区| 欧美日韩午夜爽爽| 激情黄产视频在线免费观看| 91九色最新地址| 中文字幕一区二区在线观看视频 | 日本不卡二区| av免费在线网站| 精品久久在线播放| 日韩一区二区三区不卡视频| 日韩一区免费| 亚洲一区二区久久| 久久精品视频8| 免费成人美女在线观看| 成人午夜电影在线播放| 九色在线视频蝌蚪| 一片黄亚洲嫩模| 奇米影音第四色| 加勒比色综合久久久久久久久 | 日本理论片午伦夜理片在线观看| 欧美性videos高清精品| 久久久久久久高清| 香蕉人人精品| 欧美大片欧美激情性色a∨久久| 中文字幕激情小说| 国产精品456| 亚洲欧美精品| 成人免费看视频网站| 日韩美女视频一区二区在线观看| 亚洲欧美va天堂人熟伦| 99视频+国产日韩欧美| 成人免费看黄网站| 欧美69xxxxx| 亚洲成人激情自拍| 亚洲第一区第二区第三区| 免费成人av| 国产+成+人+亚洲欧洲| 国产精品久久久久毛片| 国产人久久人人人人爽| 韩日视频在线观看| 日韩有吗在线观看| 久久天堂电影网| 中文字幕一区二区在线视频| 99精品在线免费| 青青青青在线视频| 狂野欧美xxxx韩国少妇| 日韩在线免费视频| 亚洲婷婷久久综合| 久久久99久久| 国产成人久久777777| 日韩a级大片| 久久免费在线观看| 亚洲精品视频专区| 亚洲黄色免费电影| 免费看的av网站| 亚洲国产老妈| 92国产精品久久久久首页 | 亚洲一区二区精品3399| japan高清日本乱xxxxx| 国产精品久久久久久| 国产欧美日韩专区发布| 在线国产情侣| 欧美老肥妇做.爰bbww| 中文国语毛片高清视频| 麻豆成人av在线| 免费观看黄色的网站| 91丨精品丨国产| 久久综合色88| 国产黄a三级三级三级| 亚洲另类色综合网站| 911av视频| 亚洲最新色图| 国产伦精品一区二区三区高清版 | 国产美女一区| 日韩欧美国产二区| 成人在线观看免费视频| 在线观看中文字幕亚洲| 一级片在线观看视频| 亚洲日本成人在线观看| 日本高清免费在线视频| 亚洲欧美综合| 国内一区在线| 向日葵视频成人app网址| 伊人亚洲福利一区二区三区| 亚洲一卡二卡在线| 一区2区3区在线看| 捆绑凌虐一区二区三区| 麻豆久久婷婷| 伊人久久99| 91蜜桃臀久久一区二区| …久久精品99久久香蕉国产| 国产女主播在线写真| 91精品国产品国语在线不卡| 久久亚洲AV无码| 26uuu精品一区二区| 国产精品视频黄色| 欧美国产三级| 美媛馆国产精品一区二区| 成人在线免费电影网站| 久久91亚洲精品中文字幕奶水| 色婷婷av一区二区三| 色就色 综合激情| 丝袜美腿小色网| 99精品在线观看视频| 粉色视频免费看| 亚洲免费大片| 一区二区三区四区视频在线观看 | 亚洲国产精品一区在线观看不卡 | 国产高清精品在线| 国产日韩一区二区在线| 91精品精品| 蜜桃麻豆www久久国产精品| 日本精品久久| 97国产成人精品视频| 黄色在线免费| 亚洲欧美另类国产| 精品人妻一区二区三区含羞草| 一本色道久久综合亚洲精品按摩| 内射一区二区三区| 久久久久久影视| 国产a√精品区二区三区四区| 青青草国产成人av片免费| 国产欧美精品aaaaaa片| 成久久久网站| 久热国产精品视频一区二区三区| 精品国产亚洲一区二区三区大结局 | 日韩妆和欧美的一区二区| 51精品国产| 91精品视频播放| 免费污视频在线一区| 97视频在线观看免费高清完整版在线观看| 1769在线观看| 亚洲视频第一页| 午夜视频在线免费播放| 日韩一级片在线播放| 一级黄色大片免费| 一本色道亚洲精品aⅴ| 国产无遮挡又黄又爽又色| 亚洲精品日产精品乱码不卡| 五月天精品在线| 国产亚洲福利社区一区| 日韩www视频| 国产成人av电影免费在线观看| 一二三av在线| 韩国欧美国产1区| www午夜视频| 久久激情五月激情| 亚洲视频在线观看一区二区三区| 国产偷自视频区视频一区二区| 亚洲精品蜜桃久久久久久| 欧美一区激情| 国产一级片91| 欧美日本免费| 高清无码一区二区在线观看吞精| 久久久久久久久99精品大| 杨幂一区欧美专区| 久久高清精品| 桥本有菜av在线| 亚洲精品网址| 91嫩草国产丨精品入口麻豆| 91精品国产福利在线观看麻豆| 一区二区三区偷拍| 小说区亚洲自拍另类图片专区| 一区二区三区精品国产| 日韩精品一区二区久久| 亚洲欧美精品在线观看| 久久久久久免费视频| 国产成年人在线观看| 久久精品青草| 精品视频在线观看一区二区| 国产精品va| 中文字幕无码精品亚洲资源网久久| 日韩一级网站| 久久美女福利视频| 日韩不卡一区二区| 老司机久久精品| 国产福利精品一区二区| 国产精品入口麻豆| 久久女同互慰一区二区三区| 无码人妻aⅴ一区二区三区69岛| 久久久久久久久99精品| 女人黄色一级片| 亚洲日本护士毛茸茸| 日本少妇全体裸体洗澡| 欧美视频精品一区| 亚洲一区在线观| 日韩三级在线免费观看| 午夜影院免费体验区| 亚洲人成网站色ww在线| 国产网站在线免费观看| 欧美高清视频在线观看| 最近在线中文字幕| 91精品国产综合久久香蕉| 综合久久成人| 蜜桃麻豆www久久国产精品| 日韩在线视屏| av在线播放天堂| 蜜桃av一区二区三区| 国产精品日日摸夜夜爽| 国产亚洲一区二区三区四区| 精品国产欧美日韩不卡在线观看 | 嫩草影院一区二区三区| 欧美精品乱码久久久久久按摩| 成人毛片在线免费观看| 亚洲最新视频在线| 黄页网站在线| 国产欧美精品日韩精品| www.国产精品一区| 色就是色欧美| 国产精品啊v在线| 激情视频免费网站| 99久久久精品| 日韩一卡二卡在线观看| 精品久久久久久久久久国产| 一级全黄少妇性色生活片| 日韩av网站在线| www在线免费观看视频| 国产不卡精品视男人的天堂| 日韩在线视频一区二区三区| 日日夜夜精品网站| 亚洲国产高清一区二区三区| 色婷婷综合网站| 99国产欧美久久久精品| 手机在线免费看毛片| 91官网在线观看| 天天干视频在线观看| 久久夜色精品国产欧美乱| 欧美电影免费看| 国内外成人免费视频| 欧美三级网页| 在线能看的av网站| 国产欧美一区二区精品性色 | 欧美日本一道本| 国产在线视频你懂得| 91精品国产91久久久久| 伊人www22综合色| 艳母动漫在线免费观看| 秋霞午夜鲁丝一区二区老狼| 青青草成人免费视频| 亚洲午夜久久久久久久久久久| 国产精品永久久久久久久久久| 亚洲最新视频在线| 成人软件在线观看| 好看的日韩精品| 亚洲日本视频| 日本一级片在线播放| 亚洲午夜av在线| 亚洲欧美另类综合| 欧美久久精品午夜青青大伊人| 亚洲三级在线| 一区二区三区四区视频在线| 蜜臀久久久久久久| 日本人亚洲人jjzzjjz| 在线看国产日韩| 波多野结衣一区二区| 国产精品第10页| 日韩精品一区二区久久| 久热在线视频观看| 中文字幕在线不卡视频| 亚洲天堂自拍偷拍| 久久久成人精品| 高清国产一区二区三区四区五区| 干日本少妇视频| 国产精品自在在线| 久久一区二区三| 亚洲国产精品网站| 忘忧草在线日韩www影院| 免费久久一级欧美特大黄| 午夜在线一区二区| 久操视频在线观看免费| 欧美另类高清zo欧美| 操你啦在线视频| 成人在线资源网址| av不卡免费看| 日本精品在线观看视频| 欧美视频在线观看一区二区| 午夜视频成人| 91九色蝌蚪成人| 一本色道久久精品| 一级性生活大片| 欧美区在线观看| 免费电影网站在线视频观看福利| 国产自产在线视频一区| 久色成人在线| 中文字幕电影av| 亚洲国产成人在线视频| 69久成人做爰电影| 一本久久a久久精品vr综合| 国产一区二区三区精品欧美日韩一区二区三区| 激情五月婷婷小说| 亚洲欧美成人一区二区在线电影| 日韩综合av| 亚洲国产精品成人天堂| 国产日韩欧美不卡| www.色视频| 国产精品av电影| 国产中文一区| 天天操天天舔天天射| 日韩女优av电影| 欧美xnxx| 黄页网站在线观看视频| 中文无字幕一区二区三区| 国产成人精品一区二区无码呦| 欧美中文字幕在线观看| 水蜜桃精品av一区二区| 精品国产一区在线| 欧美日韩的一区二区| av资源在线| 亚洲国产精品影视| wwwwxxxxx欧美| a级片在线免费看| 全亚洲最色的网站在线观看| 欧美99在线视频观看| 先锋影音av在线| 亚洲大胆人体av| 精品国产亚洲一区二区三区在线 | 超碰在线免费97|