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

基于IM場(chǎng)景下的Wasm初探:提升Web應(yīng)用性能

開(kāi)發(fā) 前端
在大多數(shù)場(chǎng)景下我們都不需要用到WebAssembly。因?yàn)閂8等JS引擎的優(yōu)化帶來(lái)了巨大的性能提升,已經(jīng)足夠讓JavaScript應(yīng)對(duì)絕大多數(shù)的普通場(chǎng)景了,如果要做進(jìn)一步優(yōu)化密集計(jì)算任務(wù)時(shí)使用Web worker也都能解決掉。

一、何為Wasm ?

Wasm,全稱 WebAssembly,官網(wǎng)描述是一種用于基于堆棧的虛擬機(jī)的二進(jìn)制指令格式。Wasm被設(shè)計(jì)為一個(gè)可移植的目標(biāo),用于編譯C/C++/Rust等高級(jí)語(yǔ)言,支持在Web上部署客戶端和服務(wù)器應(yīng)用程序。

Wasm 的開(kāi)發(fā)者參考文檔:https://developer.mozilla.org/en-US/docs/WebAssembly

簡(jiǎn)單的來(lái)說(shuō)就是使用C/C++/Rust等語(yǔ)言編寫(xiě)的代碼,經(jīng)過(guò)編譯后得到匯編指令,再通過(guò)JavaScript相關(guān)API將文件加載到Web容器中,一句話解釋就是運(yùn)行在Web容器中的匯編代碼。Wasm是一種可移植、體積小、加載快速的二進(jìn)制格式,可以將各種編程語(yǔ)言的代碼編譯成Wasm模塊,這些模塊可以在現(xiàn)代瀏覽器中直接運(yùn)行。尤其在涉及到GPU或CPU計(jì)算時(shí)優(yōu)勢(shì)相對(duì)比較明顯。

二、為什么需要Wasm ?

JavaScript是解釋型語(yǔ)言,相比于編譯型語(yǔ)言需要在運(yùn)行時(shí)轉(zhuǎn)換,所以解釋型語(yǔ)言的執(zhí)行速度要慢于編譯型語(yǔ)言。

編譯型語(yǔ)言和解釋型語(yǔ)言代碼執(zhí)行的大致流程如下:

圖片圖片

如上流程圖所示,解釋型語(yǔ)言每次執(zhí)行都需要把源碼轉(zhuǎn)換一次才能執(zhí)行,而轉(zhuǎn)換過(guò)程非常耗費(fèi)時(shí)間和性能,所以在 JavaScript背景下,Web執(zhí)行一些高性能應(yīng)用是非常困難的,如視頻剪輯、3D游戲等。

Wasm具有緊湊的二進(jìn)制格式,可以接近原生的性能運(yùn)行,并為C/C++等語(yǔ)言提供一個(gè)編譯目標(biāo),以便它們可以在Web上運(yùn)行。被設(shè)計(jì)為可以與JavaScript共存,允許兩者一起工作。在特定的業(yè)務(wù)場(chǎng)景下可以完美的彌補(bǔ)JavaScript的缺陷。

三、優(yōu)勢(shì)和限制

優(yōu)勢(shì):

  • 性能優(yōu)異:相比JavaScript代碼,Wasm使用節(jié)省內(nèi)存,快速加載和解釋的二進(jìn)制代碼,具備更快執(zhí)行速度,它是直接在底層虛擬機(jī)中運(yùn)行的。這使得Web應(yīng)用程序可以更高效地處理復(fù)雜的計(jì)算任務(wù),例如圖形渲染、物理模擬等。
  • 跨平臺(tái)兼容:Wasm可以在幾乎所有現(xiàn)代瀏覽器中運(yùn)行,兼容性可參考caniuse,無(wú)論是桌面還是移動(dòng)設(shè)備。這意味著開(kāi)發(fā)者可以使用各種編程語(yǔ)言來(lái)編寫(xiě)Web應(yīng)用程序,而不僅僅局限于JavaScript。
  • 安全性:Wasm運(yùn)行在沙箱環(huán)境中,提供了良好的安全性。使用了一系列安全措施,如內(nèi)存隔離和沙箱限制,以防止惡意代碼對(duì)系統(tǒng)的攻擊。
  • 模塊化:Wasm模塊可以作為獨(dú)立的組件進(jìn)行開(kāi)發(fā)和部署,開(kāi)發(fā)者可以更好地管理和維護(hù)代碼庫(kù)。模塊化的設(shè)計(jì)也為將來(lái)的性能優(yōu)化和增量更新提供了便利。

局限性:

  • 生態(tài)系統(tǒng)不夠完善:盡管Wasm已經(jīng)成為Web開(kāi)發(fā)中的關(guān)鍵技術(shù)之一,但生態(tài)系統(tǒng)仍然不夠完善。Wasm的工具、框架和庫(kù)的數(shù)量遠(yuǎn)不如JavaScript。
  • 開(kāi)發(fā)門檻較高:Wasm的開(kāi)發(fā)門檻相對(duì)較高。Wasm需要使用一種新的語(yǔ)言來(lái)編寫(xiě),如C或C++等。這使得學(xué)習(xí)和使用Wasm的成本相對(duì)較高。尤其是在內(nèi)存管理等方面會(huì)增加開(kāi)發(fā)的復(fù)雜性。
  • 與JavaScript集成問(wèn)題:Wasm與JavaScript之間的集成問(wèn)題是一個(gè)挑戰(zhàn)。開(kāi)發(fā)人員需要解決如何在Web應(yīng)用程序中同時(shí)使用Wasm和JavaScript的問(wèn)題。
  • 兼容性問(wèn)題:雖然現(xiàn)代瀏覽器已經(jīng)開(kāi)始支持Wasm,但是在一些老舊的瀏覽器中可能存在兼容性問(wèn)題,需要開(kāi)發(fā)者進(jìn)行額外的處理來(lái)確保代碼的兼容性。

四、Wasm工作原理

通過(guò)上述的編譯型語(yǔ)言和解釋型語(yǔ)言代碼執(zhí)行的大致流程我們可以知道Wasm是不需要被解釋的,是由開(kāi)發(fā)者提前編譯為WebAssembly二進(jìn)制格式,如下圖所示。由于變量類型都是預(yù)知的,因此瀏覽器加載WebAssembly文件時(shí),JavaScript引擎無(wú)須監(jiān)測(cè)代碼。它可以簡(jiǎn)單地將這段代碼的二進(jìn)制格式編譯為機(jī)器碼。

圖片圖片

從這個(gè)流程中我們也可以看出,如果將每種編程語(yǔ)言都直接編譯為機(jī)器碼的各個(gè)版本,這樣效率是不是更高呢?想法是好的,但實(shí)現(xiàn)過(guò)程確實(shí)復(fù)雜不堪的。由于瀏覽器是可以在若干不同的處理器 (比如手機(jī)和平板等設(shè)備) 上運(yùn)行,因此為每個(gè)可能的處理器發(fā)布一個(gè)WebAssembly代碼的編譯后版本會(huì)很難做到。

我們可以通過(guò)替代方法即取得IR代碼。IR即為中間代碼(Intermediate Representation),它是編譯器中很重要的一種數(shù)據(jù)結(jié)構(gòu)。編譯器在做完前端工作以后,首先就生成IR,并在此基礎(chǔ)上執(zhí)行各種優(yōu)化算法,最后再生成目標(biāo)代碼。可以簡(jiǎn)化為如下流程:

圖片圖片

編譯器將IR代碼轉(zhuǎn)換為一種專用字節(jié)碼并放入后綴為.wasm的文件中。此時(shí)Wasm文件中的字節(jié)碼還不是機(jī)器碼,它只是支持WebAssembly的瀏覽器能夠理解的一組虛擬指令。當(dāng)加載到支持WebAssembly的瀏覽器中時(shí),瀏覽器會(huì)驗(yàn)證這個(gè)文件的合法性,然后這些字節(jié)碼會(huì)繼續(xù)編譯為瀏覽器所運(yùn)行的設(shè)備上的機(jī)器碼。

更加詳情的原理和使用方式可以前往https://developer.mozilla.org/en-US/docs/WebAssembly/JavaScript_interface查閱。

五、應(yīng)用場(chǎng)景

在Web開(kāi)發(fā)中,可以使用Wasm來(lái)提高應(yīng)用程序的性能。以下是一些使用Wasm的常見(jiàn)場(chǎng)景:

  • 高性能計(jì)算:如果應(yīng)用程序需要進(jìn)行大量的數(shù)值計(jì)算、圖像處理或者復(fù)雜的算法運(yùn)算,可以將這部分代碼編譯成Wasm模塊,以提高計(jì)算性能。
  • 游戲開(kāi)發(fā):Wasm可以用于創(chuàng)建高性能的HTML5游戲,通過(guò)將游戲邏輯編譯成Wasm模塊,可以實(shí)現(xiàn)更流暢的游戲體驗(yàn)。
  • 跨平臺(tái)應(yīng)用:使用Wasm可以實(shí)現(xiàn)跨平臺(tái)的應(yīng)用程序,無(wú)論是桌面還是移動(dòng)設(shè)備,用戶都可以通過(guò)瀏覽器來(lái)訪問(wèn)和使用。
  • 移植現(xiàn)有代碼:如果已經(jīng)有用其他編程語(yǔ)言編寫(xiě)的代碼,可以通過(guò)將其編譯成Wasm模塊,將其集成到現(xiàn)有的Web應(yīng)用程序中,而無(wú)需重寫(xiě)整個(gè)應(yīng)用程序。

六、產(chǎn)品案例

  • 設(shè)計(jì)工具Figma-Wasm文件大小為27.7M

圖片圖片

  • Google Earth-Wasm文件總計(jì)大小為192.M
  • 支持各大瀏覽器的3D地圖,而且運(yùn)行流暢
  • B站-視頻處理和播放也有使用Wasm,Wasm文件大小為344kb

圖片圖片

  • 跨平臺(tái)的OpenGL圖形引擎Magnum-Wasm文件大小為844kb

圖片圖片

七、實(shí)踐案例

這里我們通過(guò)使用Rust + Wasm實(shí)現(xiàn)Wasm與JavaScript之間的數(shù)據(jù)調(diào)用,理解Rust和Wasm的交互過(guò)程。

使用Rust就需要做一些前置的環(huán)境配置,詳情的步驟可參考Rust官網(wǎng):

https://www.rust-lang.org/zh-CN/tools/install。

安裝wasm-pack,wasm-pack是一個(gè)構(gòu)建、測(cè)試和發(fā)布Wasm的Rust CLI工具,我們將使用wasm-pack相關(guān)的命令來(lái)構(gòu)建Wasm二進(jìn)制內(nèi)容。這有助于將代碼編譯為WebAssembly,并生成在瀏覽器中使用的正確包。

Rust項(xiàng)目初始化

執(zhí)行cargo new rust_wasm初始化Rust項(xiàng)目,自動(dòng)生成配置文件Cargo.toml,項(xiàng)目結(jié)構(gòu)如下:

/Users/admin/RustroverProjects/rust_wasm
├── Cargo.lock
├── Cargo.toml
├── src
|  └── lib.rs
└── target
   ├── CACHEDIR.TAG
   └── debug
      ├── build
      ├── deps
      ├── examples
      └── incremental

配置包文件

我們可以在Cargo.toml文件中加上下列代碼并保存,保存之后Cargo會(huì)自動(dòng)下載依賴。

  • crate-type = ["cdylib"],表示編譯時(shí)候使用C標(biāo)準(zhǔn)的動(dòng)態(tài)庫(kù)。
  • #[wasm_bindgen]是一個(gè)屬性宏,來(lái)自于wasm_bindgen這個(gè)crate,是一個(gè)簡(jiǎn)化Rust WASM與JS之間交互的庫(kù)。 
[lib]
crate-type = ["cdylib"]


[dependencies]
wasm-bindgen = { version = "0.2.89", features = [] }

 編寫(xiě)代碼

編寫(xiě)代碼之前我們先明確Rust中crate包的概念,Rust中包管理系統(tǒng)將crate包分為二進(jìn)制包(Binary)和庫(kù)包(Library)兩種,二者可以在同一個(gè)項(xiàng)目中同時(shí)存在。

二進(jìn)制包:

  • main.rs是二進(jìn)制項(xiàng)目的入口
  • 二進(jìn)制項(xiàng)目可直接執(zhí)行
  • 一個(gè)項(xiàng)目中二進(jìn)制包可以有多個(gè),所以在Cargo.toml中通過(guò)雙方括號(hào)標(biāo)識(shí) [[bin]]

庫(kù)包:

  • lib.rs是庫(kù)包的入口
  • 庫(kù)項(xiàng)目不可直接執(zhí)行,通常用來(lái)作為一個(gè)模塊被其他項(xiàng)目引用
  • 一個(gè)項(xiàng)目中庫(kù)包僅有1個(gè),在Cargo.toml中通過(guò)單方括號(hào)標(biāo)識(shí) [lib]

因?yàn)槲覀冞@里希望將 Wasm 轉(zhuǎn)為一個(gè)可以在JS項(xiàng)目中使用的模塊,所以需要使用庫(kù)包 lib.rs 的命名,代碼如下。

use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub extern "C" fn rust_add(left: i32, right: i32) -> i32 {
    println!("Hello from Rust!");
    left + right
}

執(zhí)行編譯

這里我們要使用到wasm-pack,將上述的Rust代碼編譯為能夠被JS導(dǎo)入的模塊,根據(jù)wasm-pack提供的target方式可以指定構(gòu)建的產(chǎn)物,如截圖所示:

圖片圖片

編譯過(guò)程效果:

編譯完成后,我們會(huì)發(fā)現(xiàn)根目錄下多了一個(gè)pkg/ 文件夾,里面就是我們的Wasm產(chǎn)物所在的npm包了。目錄結(jié)構(gòu)如下:

/Users/admin/RustroverProjects/rust_wasm/pkg
├── package.json
├── rust_wasm.d.ts
├── rust_wasm.js
├── rust_wasm_bg.wasm
└── rust_wasm_bg.wasm.d.ts

rust_wasm.d.ts文件內(nèi)容:

/* tslint:disable */
/* eslint-disable */
/**
* @param {number} num
* @returns {string}
*/
export function msg_insert(num: number): string;
/**
* @param {number} left
* @param {number} right
* @returns {number}
*/
export function rust_add(left: number, right: number): number;
/**
*/
export function rust_thread(): void;


export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;


export interface InitOutput {
  readonly memory: WebAssembly.Memory;
  readonly msg_insert: (a: number, b: number) => void;
  readonly rust_add: (a: number, b: number) => number;
  readonly rust_thread: () => void;
  readonly __wbindgen_add_to_stack_pointer: (a: number) => number;
  readonly __wbindgen_free: (a: number, b: number, c: number) => void;
}


export type SyncInitInput = BufferSource | WebAssembly.Module;
/**
* Instantiates the given `module`, which can either be bytes or
* a precompiled `WebAssembly.Module`.
*
* @param {SyncInitInput} module
*
* @returns {InitOutput}
*/
export function initSync(module: SyncInitInput): InitOutput;


/**
* If `module_or_path` is {RequestInfo} or {URL}, makes a request and
* for everything else, calls `WebAssembly.instantiate` directly.
*
* @param {InitInput | Promise<InitInput>} module_or_path
*
* @returns {Promise<InitOutput>}
*/
export default function __wbg_init (module_or_path?: InitInput | Promise<InitInput>): Promise<InitOutput>;

wasm-pack打包不僅輸出一個(gè)ESM規(guī)范的模塊,而且還支持自動(dòng)生成d.ts文件,對(duì)模塊的使用者非常友好。如下:

圖片圖片

在前端項(xiàng)目中引入使用

'use client'
/*
 * @Author: wangweiqiang
 * @Date: 2024-06-18 17:03:34
 * @LastEditors: wangweiqiang
 * @LastEditTime: 2024-06-18 23:09:55
 * @Description: app.tsx
 */
import Image from "next/image";
import { useCallback, useEffect, useState } from "react";
import init, * as rustLibrary from 'rust_wasm'
export default function Home() {
  const [addResult, setAddResult] = useState<number | null>(null)
  const [calculateTime, setCalculateTime] = useState<string>('')


  const initRustLibrary = useCallback(() => {
    init().then(() => {
      const result = rustLibrary.rust_add(5, 6)
      const timeStamp = rustLibrary.msg_insert(50000)
      setCalculateTime(timeStamp)
      setAddResult(result)
    })
  }, [])


  useEffect(() => {
    initRustLibrary()
  }, [initRustLibrary]);


  return (
    <main className="flex min-h-screen flex-col items-center p-24">
      {/* .... */}
      <div className="mt-32 grid text-center lg:mb-0 lg:w-full lg:max-w-5xl lg:grid-cols-4 lg:text-left">
        <div>
          rust代碼計(jì)算結(jié)果:{addResult}
        </div>
        <div style={{ marginTop: '20px' }}>
          二分法方式{calculateTime}
        </div>
      </div>
    </main>
  );
}

圖片圖片

性能比較

在IM場(chǎng)景下,聊天消息中核心的處理流程在于數(shù)據(jù)的排序、去重,大量的數(shù)據(jù)查找會(huì)非常耗時(shí),在這里我們通過(guò)二分法的方式對(duì)Rust和JavaScript兩種實(shí)現(xiàn)方式的耗時(shí)進(jìn)行一個(gè)簡(jiǎn)單的對(duì)比,Rust代碼如下:

use chrono::{DateTime, Utc};
use rand::Rng;


#[derive()]
#[allow(dead_code)]
struct Data {
    content: String,
    from: String,
    head: String,
    msg_id: String,
    seq: i32,
    sid: String,
    topic: String,
    ts: DateTime<Utc>,
}


impl Data {
    fn new(
        content: String,
        from: String,
        head: String,
        msg_id: &str,
        seq: i32,
        sid: String,
        topic: String,
        ts: DateTime<Utc>,
    ) -> Self {
        Data {
            content,
            from,
            head,
            msg_id: msg_id.to_string(),
            seq,
            sid,
            topic,
            ts,
        }
    }
}


// 獲取原始數(shù)據(jù)
fn get_origin_data(num: i32) -> Vec<Data> {
    let mut data: Vec<Data> = vec![]; // 存儲(chǔ)數(shù)據(jù)的向量
    ....                              // 創(chuàng)建 num 個(gè)數(shù)據(jù)
    data
}
// 初始化結(jié)構(gòu)體數(shù)據(jù)
fn init_struct_data(num: i32, text: &str) -> Data {
    let mut rng = rand::thread_rng();
    let content = format!("{}_{}", rng.gen_range(1000..=9999), text).to_string();
    ....
    let ts = Utc::now();
    Data::new(content, from, head, &msg_id.as_str(), seq, sid, topic, ts)
}


// 二分法插入
fn binary_insert(data: &mut Vec<Data>, new_data: Data) {
    let _insert_pos = match data.binary_search_by_key(&new_data.seq, |d| d.seq) {
        Ok(pos) => {
            data[pos] = new_data;
            pos
        }
        Err(pos) => {
            data.insert(pos, new_data);
            pos
        }
    };
}
#[wasm_bindgen]
pub extern "C" fn msg_insert(num: i32) -> String {
    let mut data: Vec<Data> = get_origin_data(1000);
    let test_mode = [num];
    let start_time = Utc::now().naive_utc().timestamp_micros();
    for test_num in 0..test_mode.len() {
        for num in 0..test_mode[test_num] {
            let data_list = init_struct_data(num, "test");
            binary_insert(&mut data, data_list);
        }
    }
    let duration = Utc::now().naive_utc().timestamp_micros() - start_time;
    let result = format!("插入{}條數(shù)據(jù)執(zhí)行耗時(shí):{}微秒", num, duration);
    result
}

數(shù)據(jù)對(duì)比分析:

圖片圖片

可以看到,在數(shù)據(jù)量不大的場(chǎng)景下,Wasm的耗時(shí)是比純JavaScript長(zhǎng)的,這是因?yàn)闉g覽器需要在VM容器中對(duì) Wasm模塊進(jìn)行實(shí)例化,這一部分會(huì)消耗相當(dāng)?shù)臅r(shí)間,導(dǎo)致性能不如純JavaScript的執(zhí)行。但隨著運(yùn)算規(guī)模變大,Wasm的優(yōu)化越來(lái)越明顯。這是因?yàn)閃ebAssembly是一種低級(jí)別的二進(jìn)制格式,經(jīng)過(guò)高度優(yōu)化,并且能夠更好地利用系統(tǒng)資源。相比之下,JavaScript是一種解釋性語(yǔ)言,性能可能會(huì)受到解釋器的限制。

八、總結(jié)

在大多數(shù)場(chǎng)景下我們都不需要用到WebAssembly。因?yàn)閂8等JS引擎的優(yōu)化帶來(lái)了巨大的性能提升,已經(jīng)足夠讓JavaScript應(yīng)對(duì)絕大多數(shù)的普通場(chǎng)景了,如果要做進(jìn)一步優(yōu)化密集計(jì)算任務(wù)時(shí)使用Web worker也都能解決掉。只有在以上的少數(shù)場(chǎng)景下,我們才需要做這種“二次提升”。

WebAssembly雖然有天然的優(yōu)勢(shì),但也有自己的局限性,在使用時(shí)我們也需要考慮多方面因素,例如生態(tài)、開(kāi)發(fā)成本等等。不過(guò)我們依然可以持續(xù)關(guān)注WebAssembly的發(fā)展。

責(zé)任編輯:武曉燕 來(lái)源: 得物技術(shù)
相關(guān)推薦

2017-12-13 13:09:36

NginxWeb應(yīng)用

2013-01-14 12:24:06

Firefox OS

2014-08-26 15:02:04

mAPM移動(dòng)應(yīng)用性能監(jiān)測(cè)AppDynamics

2018-08-23 17:45:52

2013-08-09 14:18:33

2023-11-06 08:01:09

Go同步異步

2015-12-14 10:39:14

2024-12-10 08:09:15

2023-11-07 11:11:42

Go性能

2023-09-04 07:30:03

Wasm匯編語(yǔ)言

2014-04-24 10:11:17

iOS性能調(diào)優(yōu)

2009-10-14 20:37:41

sun閃存固態(tài)硬盤(pán)

2010-08-25 09:48:14

W3CWeb性能工作組

2010-04-02 15:20:44

惠普成功案例

2009-08-25 15:35:45

citrxinetscalerncore

2009-07-17 19:09:42

虛擬化VMware服務(wù)器

2009-07-16 10:57:04

虛擬化新功能性能

2014-08-04 16:38:37

移動(dòng)應(yīng)用

2021-08-09 16:39:52

工具JVM剖析

2018-02-03 10:16:05

JavaScript Web 應(yīng)用
點(diǎn)贊
收藏

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

芒果视频成人app| 国产美女主播在线播放| 亚洲精品一区二区二区| 91九色综合| 中文字幕精品一区二区三区精品| 97色在线观看| 一色道久久88加勒比一| 成人交换视频| 亚洲男同性恋视频| 91高清免费在线观看| 四虎国产精品成人免费入口| 另类一区二区| 国产宾馆实践打屁股91| 亚洲黄页网在线观看| 91国视频在线| 国产99免费视频| 日韩电影免费网址| 日韩片之四级片| 91猫先生在线| 国产精品久久久久久久久久久久久久久久久久 | 日韩黄色片网站| 日韩欧美伦理| 亚洲а∨天堂久久精品9966| 久久综合狠狠综合久久综青草| 天堂网中文字幕| 亚洲电影在线一区二区三区| 亚洲精品福利在线观看| 欧美日韩中文不卡| 无码国产色欲xxxx视频| 麻豆精品久久久| 欧美在线性视频| 欧美精品乱码视频一二专区| 欧美精品系列| 午夜精品福利一区二区蜜股av| 91日本在线观看| 久久久久99精品成人| 老司机凹凸av亚洲导航| 欧美自拍偷拍午夜视频| 国产真人做爰毛片视频直播| av中文字幕在线| 成人高清在线视频| 成人福利网站在线观看| 6080午夜伦理| 99视频精品| 毛片精品免费在线观看| 天天干天天舔天天操| 美女的胸无遮挡在线观看| 色在线免费视频| 亚洲成人一区| 国产午夜精品全部视频播放 | 高h视频在线播放| 国产精品大尺度| 热re99久久精品国产99热 | 日韩精品欧美激情| 亚洲女则毛耸耸bbw| 黄色大片在线播放| 国产女同性恋一区二区| 精品无人区一区二区三区 | av男人天堂一区| 日本高清不卡的在线| 欧美精品一区二区成人| 91亚洲一区| 一个人www欧美| 国产亚洲精品久久久久久久| 中文日本在线观看| 国产欧美一区二区精品忘忧草 | 久久亚洲精品国产精品紫薇| 国产精品精品软件视频| 国产免费不卡av| 久久精品久久久精品美女| 国产精品欧美一区二区三区奶水 | 欧美精品1区2区3区| 久久久久久免费网| 日韩美女在线播放| 国产无遮挡呻吟娇喘视频| 99视频精品免费观看| 九九热r在线视频精品| 丁香花五月激情| 亚洲最新色图| 国模精品视频一区二区| 在线观看欧美一区二区| 日韩精品成人在线观看| 国产伦精品免费视频| 手机在线看片1024| 影音先锋久久| 97在线视频精品| 青草草在线视频| 国产精品高清一区二区| 在线播放视频一区| 亚洲丝袜在线观看| 精品av导航| 亚洲色图18p| 亚洲AV成人无码网站天堂久久| 日韩成人免费| 欧美xxxx做受欧美.88| 国产亚洲精品成人| 亚洲经典三级| 国产精品久久久久久亚洲影视| 成人夜晚看av| 99这里有精品视频| 91美女在线视频| 91久久综合亚洲鲁鲁五月天| 亚洲爱情岛论坛永久| 久久久一区二区| 17c丨国产丨精品视频| 丁香婷婷久久| 精品视频久久久| 青娱乐免费在线视频| 日韩电影网1区2区| 精品欧美一区二区精品久久| 二区三区在线观看| 国产精品久久久久永久免费观看 | 蜜桃视频在线观看网站| 国产成人啪免费观看软件| 欧美日韩一区二 | 青青免费在线视频| 亚洲自拍另类综合| 999这里有精品| 国产探花一区二区| 性色av香蕉一区二区| 99久久久久成人国产免费| 中文字幕精品一区二区精品绿巨人| av免费观看国产| 国产精品成人久久电影| 亚洲网中文字幕| 欧美日韩精品一区二区三区在线观看| 在线视频欧美性高潮| 国产精品国产三级国产专区52| 国产成人高清视频| 在线观看你懂的视频| 婷婷亚洲精品| 色中色综合影院手机版在线观看| 国产情侣呻吟对白高潮| 91亚洲大成网污www| 国产h片在线观看| 色一情一伦一子一伦一区| 国产原创精品| 国产精品久久久久久在线| 91蜜桃网址入口| www.av蜜桃| 国产真实的和子乱拍在线观看| 免费久久精品视频| 日韩电影免费观看在| 免费日韩电影| 国产视频久久久| 97久久久久久久| 不卡一二三区首页| 国产a级片网站| 国产欧美三级电影| 性欧美激情精品| 日韩中文字幕免费观看| 亚洲国产综合91精品麻豆| 古装做爰无遮挡三级聊斋艳谭| 欧美日韩国产在线观看网站 | 欧美人妇做爰xxxⅹ性高电影| 欧美久久久久久久久| 大乳护士喂奶hd| 九九热线有精品视频99| 日韩精品dvd| 国产小视频91| 中文字幕在线观看你懂的| 国产精品欧美一区喷水| 最新国产黄色网址| 欧美不卡视频| 日韩av成人在线| 波多野结衣在线网站| 欧美男人的天堂一二区| 国产极品国产极品| 成人精品免费视频| 国产亚洲天堂网| 欧美高清视频在线观看mv| 91色中文字幕| 91禁在线看| 亚洲日本aⅴ片在线观看香蕉| 中国女人真人一级毛片| 亚洲你懂的在线视频| 182在线视频| 三级不卡在线观看| 99久久99久久精品| 亚洲理论电影片| 91免费欧美精品| av手机在线观看| 中文字幕九色91在线| 精品久久人妻av中文字幕| 欧美性69xxxx肥| 一本之道在线视频| 亚洲人成毛片在线播放女女| 日日骚一区二区网站| 国产电影一区| 欧美中文字幕在线播放| 久久精品视频观看| 日韩av最新在线观看| 一区二区三区在线免费观看视频| 亚洲自拍偷拍av| 免费看的黄色网| 成人午夜电影小说| 无尽裸体动漫2d在线观看| 亚洲福利国产| 亚洲精品一区二| 欧美黑人做爰爽爽爽| 成人黄色网免费| 自拍网站在线观看| 欧美大肥婆大肥bbbbb| 国产视频在线看| 激情成人中文字幕| 日本不卡视频一区| 精品1区2区3区4区| 日韩精品国内| 国产伦理久久久久久妇女 | 曰本色欧美视频在线| 欧美 日韩 国产 在线| 欧美日产在线观看| caoporn国产| 午夜亚洲福利老司机| www.av成人| 精品在线观看免费| 国产日韩一区二区在线| 欧美天天在线| 中文字幕99| 精品无人区麻豆乱码久久久| 国产综合色一区二区三区| 精品一区二区三区视频在线播放| 国产精品一区=区| 日本免费久久| 欧日韩不卡在线视频| 成人观看网址| 久久久久久久亚洲精品| 自由的xxxx在线视频| 久久久www成人免费精品张筱雨| www.成人.com| 国产一区二区三区在线观看网站| 无码精品视频一区二区三区 | 91探花福利精品国产自产在线| 第四色男人最爱上成人网| 97在线日本国产| 77thz桃花论族在线观看| 欧美另类交人妖| 国产黄色在线网站| 久久久精品美女| 黄网页在线观看| 久久综合伊人77777尤物| 免费网站成人| 精品福利在线导航| 亚洲国产福利视频| 欧美大片在线观看| 性做久久久久久久久久| 欧美大胆人体bbbb| 亚洲欧美高清视频| 91国偷自产一区二区开放时间| 992在线观看| 中文字幕成人在线观看| 超碰97av在线| 国产精品成人网| 日韩精品一区二区三区在线视频| 成人欧美一区二区三区1314| 久久久久久久久久网站| 亚洲一区国产视频| 日产精品久久久久久久| 精品久久久久久久久中文字幕 | 亚洲影院一区| 无码人妻丰满熟妇区毛片18| 久久一区激情| 午夜两性免费视频| 国产一区二三区| 中文字幕永久免费| 久久亚洲一级片| jizzjizz日本少妇| 悠悠色在线精品| 日韩不卡视频在线| 欧美亚洲国产一区二区三区| 国产精品主播一区二区| 精品国产自在久精品国产| 亚洲人成色777777精品音频| 中文字幕一区电影| 色呦呦网站在线观看| 中文字幕精品在线视频| 91cn在线观看| 91成人在线播放| 青青在线精品| 国产一级特黄a大片99| 国产精品亚洲人成在99www| 亚洲一区二区三区精品在线观看| 欧美精品导航| 可以在线看的黄色网址| 国产九九视频一区二区三区| 大黑人交xxx极品hd| 国产精品色呦呦| 亚洲国产精品成人无久久精品| 91久久精品一区二区三| www.av导航| 国产一区二区三区视频在线观看 | 国产精品久久综合av爱欲tv| 久久久久九九精品影院| 欧美成人免费在线| 中文字幕免费精品| 国产真人无码作爱视频免费| 风间由美一区二区三区在线观看| 亚洲av毛片基地| 亚洲v日本v欧美v久久精品| 伊人免费在线观看| 日韩hd视频在线观看| 超碰个人在线| 国产精品男人的天堂| 色爱av综合网| 国产片侵犯亲女视频播放| 麻豆成人av在线| 欧美老熟妇乱大交xxxxx| 亚洲一区在线视频观看| 一级黄色大片免费观看| 亚洲乱码一区av黑人高潮| 四季久久免费一区二区三区四区| 国产日韩欧美视频在线| 九九亚洲视频| 国产黄色片免费在线观看| 国产一区二区网址| av在线播放中文字幕| 色综合久久综合| 日韩在线一区二区三区四区| 欧美高清视频免费观看| 丁香花在线高清完整版视频| 国产在线视频欧美| 欧美伦理在线视频| 国产黄色特级片| 91玉足脚交白嫩脚丫在线播放| 免费一级片视频| 欧美一区二区福利在线| 日本不卡在线| 国产久一一精品| 狠狠综合久久av一区二区蜜桃| 欧美牲交a欧美牲交| 成人高清视频在线观看| 国产在线视频二区| 欧美大片一区二区| 第一av在线| 国产精品12| 亚洲黄色天堂| 亚洲精品乱码久久久久久蜜桃图片| 亚洲综合色在线| 国产综合在线播放| 午夜免费在线观看精品视频| 欧美18免费视频| 青青青在线播放| 国产校园另类小说区| 国产91av在线播放| 中文字幕成人精品久久不卡| 精品久久在线| 裸体裸乳免费看| 国产成人免费高清| 国产在线视频99| 精品亚洲精品福利线在观看| 中文字幕 在线观看| 欧美亚洲丝袜| 日韩vs国产vs欧美| 四虎影视一区二区| 日韩免费性生活视频播放| 精灵使的剑舞无删减版在线观看| 成人国产一区二区| 99精品视频免费观看视频| 可以直接看的无码av| 在线观看亚洲a| 米奇777四色精品人人爽| 91黄色精品| 亚洲免费精品| av手机在线播放| 欧美日本在线播放| 久久大胆人体| 欧日韩一区二区三区| 精品一区二区三区的国产在线播放| 国产一区二区播放| 欧美成人r级一区二区三区| 日本不良网站在线观看| 日韩视频在线播放| 国产精品中文字幕一区二区三区| 日韩成人免费在线观看| 亚洲日本成人女熟在线观看| 成人影院网站ww555久久精品| 妺妺窝人体色777777| 久久久不卡网国产精品二区| 国产精品玖玖玖| 国自产精品手机在线观看视频| 国产一区二区三区四区五区| 天天干天天色天天干| 国产欧美日韩不卡| av无码精品一区二区三区宅噜噜| 久久久久久97| 成人婷婷网色偷偷亚洲男人的天堂| 天天色天天干天天色| 欧美日韩一区二区精品| 丝袜美腿美女被狂躁在线观看| 999国产在线| 日韩国产高清影视| 久久国产在线视频| 中文字幕av一区二区三区谷原希美| 91蝌蚪精品视频| 手机在线免费观看毛片| 亚洲国产精品久久久久婷婷884| www.在线播放| 国产在线一区二区三区播放| 久久www免费人成看片高清| 三级黄色在线视频|