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

Node.js的performance鉤子和測(cè)量 API

開發(fā) 前端
Node 提供的Performance API ?不僅可以幫助確定哪些部分速度較慢,還可以幫助確定它們需要多少時(shí)間。您可以通過將這些數(shù)據(jù)作為跟蹤或指標(biāo)導(dǎo)出到Jaeger?或 Prometheus 之類的內(nèi)容來進(jìn)一步探索這些數(shù)據(jù)。

當(dāng)你完成了編寫和部署了項(xiàng)目,下一步就是去改進(jìn)、消除瓶頸、提高執(zhí)行速度和優(yōu)化性能,得先了解項(xiàng)目現(xiàn)有的性能瓶頸和邏輯慢的地方。但是,沒有人喜歡猜測(cè)哪些部分可能更慢的試錯(cuò)過程。

Node.js 提供了各種內(nèi)置性能鉤子函數(shù)來衡量執(zhí)行速度,找出代碼的哪些部分值得優(yōu)化,并收集應(yīng)用程序代碼執(zhí)行的精細(xì)視圖。

在本文中,您將學(xué)習(xí)如何使用 Node.js 性能鉤子函數(shù)和測(cè)量 API 來識(shí)別瓶頸并增強(qiáng)應(yīng)用程序的性能,從而加快響應(yīng)時(shí)間并提高資源效率。

Node.js的Performance API  概述

首先要了解為什么以及何時(shí)應(yīng)該使用 Node 提供的 Performance API以及它提供的各種選項(xiàng),考慮這樣一種情況:您想要測(cè)量特定代碼塊的執(zhí)行時(shí)間。

為此,您可能已經(jīng)使用了 Date 對(duì)象,如下所示:

let start = Date.now();
for (let i = 0; i < 10000; i++) { } // stand-in for some complex calculation
let end = Date.now();
console.log(end - start);

但是,如果您運(yùn)行上述操作并觀察,您會(huì)注意到這還不夠精確。

例如,像上面這樣的空循環(huán)會(huì)將 0 或 1 記錄為差值,并且不會(huì)給我們足夠的粒度。Date 類只能提供毫秒級(jí)的粒度,如果代碼以 100 納秒的順序運(yùn)行,這不會(huì)給我們正確的測(cè)量結(jié)果。

為此,我們可以改用 Performance API 來獲得更好的測(cè)量結(jié)果:

const {performance} = require('node:perf_hooks');

let start = performance.now()
for (let i = 0; i < 10000; i++) {}
let end = performance.now()

console.log(end - start);

這樣,我們就可以得到一個(gè)更精細(xì)的值,在我的系統(tǒng)上,該值在 0.18 到 0.21 毫秒的范圍內(nèi),精度高達(dá) 15-16 位小數(shù)。這是我們可以使用 Node Performance API 更好地測(cè)量執(zhí)行時(shí)間的一種簡(jiǎn)單方法。

該 API 還提供了一種在程序運(yùn)行期間精確標(biāo)記時(shí)間點(diǎn)的方法。我們可以使用performance.mark方法獲取高精度事件的時(shí)間戳,例如循環(huán)迭代的開始時(shí)間。

運(yùn)行下面代碼:

let start_mark = performance.mark("loop_start",
  {detail:"starting loop of 1000 iterations"}
);

for (let i = 0; i < 10000; i++) {}

let end_mark = performance.mark("loop_end",
  {detail:"ending loop of 1000 iterations"}
);

console.log( start_mark, end_mark );

輸出:

PerformanceMark {
  name: 'loop_start',
  entryType: 'mark',
  startTime: 27.891528000007384,
  duration: 0,
  detail: 'starting loop of 1000 iterations'
}
PerformanceMark {
  name: 'loop_end',
  entryType: 'mark',
  startTime: 28.996093000052497,
  duration: 0,
  detail: 'ending loop of 1000 iterations'
}

mark 函數(shù)將標(biāo)記的名稱作為第一個(gè)參數(shù)。第二個(gè)參數(shù)對(duì)象中的detail允許提供有關(guān)該標(biāo)記的額外詳細(xì)信息,例如運(yùn)行的迭代次數(shù)、數(shù)據(jù)庫查詢參數(shù)等。

然后,可以使用 mark 函數(shù)返回的對(duì)象通過 Prometheus exporter sdk 將計(jì)時(shí)數(shù)據(jù)導(dǎo)出到 Prometheus 之類的東西。這允許我們?cè)趹?yīng)用程序外部查詢和可視化耗時(shí)信息。由于 mark 是一個(gè)瞬時(shí)時(shí)間點(diǎn),因此返回對(duì)象中的 duration 字段始終為零。

而不是手動(dòng)調(diào)用 performance.now 并計(jì)算兩個(gè)事件之間的差異,我們可以使用 marks 和 measure 函數(shù)執(zhí)行相同的操作。我們可以使用上面標(biāo)記的名稱來測(cè)量?jī)蓚€(gè)標(biāo)記之間的持續(xù)時(shí)間:

performance.mark("loop_start",
  {detail:"starting loop of 1000 iterations"}
);

for (let i = 0; i < 10000; i++) {}

performance.mark("loop_end",
  {detail:"ending loop of 1000 iterations"}
);

console.log(performance.measure("loop_time","loop_start","loop_end"));

measure 的第一個(gè)參數(shù)是我們要為測(cè)量指定的名稱。然后,接下來的兩個(gè)參數(shù)分別指定要開始和結(jié)束測(cè)量的標(biāo)記的名稱。

這兩個(gè)參數(shù)都是可選的 — 如果兩者都沒有給出,則為 performance.measure 將返回應(yīng)用程序啟動(dòng)和測(cè)度調(diào)用之間經(jīng)過的時(shí)間。如果我們只提供第一個(gè)參數(shù),該函數(shù)將返回性能之間經(jīng)過的performance.mark替換為該名稱和 measure 調(diào)用。

如果兩者都提供,該函數(shù)將返回它們之間的高精度時(shí)間差。對(duì)于上面的示例,我們將得到如下輸出:

PerformanceMeasure {
  name: 'loop_time',
  entryType: 'measure',
  startTime: 27.991639000130817,
  duration: 1.019368999870494
}

這可以再次與 Prometheus exporter 一起使用,以便導(dǎo)出自定義測(cè)量指標(biāo)。如果您的設(shè)置執(zhí)行藍(lán)綠或 Canary 部署,則可以比較舊版本和新版本的性能,以查看您的優(yōu)化是否按預(yù)期工作。

最后,需要注意的一點(diǎn)是,Performance API 在內(nèi)部使用固定大小的緩沖區(qū)來存儲(chǔ)標(biāo)記和度量,因此我們需要在使用完它們后對(duì)其進(jìn)行清理。這可以使用以下方法完成:

performance.clearMarks("mark_name");

或者:

performance.clearMeasures("measure_name");

這些函數(shù)將從相應(yīng)的緩沖區(qū)中刪除具有給定名稱的標(biāo)記/度量。如果在不提供任何參數(shù)的情況下調(diào)用這些函數(shù),它們將清除緩沖區(qū)中存在的所有標(biāo)記/度量,因此在沒有任何參數(shù)的情況下調(diào)用這些函數(shù)時(shí)要小心。

使用 Performance鉤子優(yōu)化您的應(yīng)用

現(xiàn)在讓我們看看如何使用這個(gè) API 來優(yōu)化我們的應(yīng)用程序。在我們的示例中,我們將考慮從數(shù)據(jù)庫中獲取一些數(shù)據(jù),然后手動(dòng)排序并將其返回給用戶的情況。

我們想了解每個(gè)操作需要多少時(shí)間,以及首先優(yōu)化的最佳位置是什么。為此,我們將首先測(cè)量發(fā)生的各種事件:

async function main(){
    const querySize = 10; // ideally this will come from user's request

    performance.mark("db_query_start",{detail:`query size ${querySize}`});
    const data = fetchData(querySize);
    performance.mark("db_query_end",{detail:`query size ${querySize}`});

    performance.mark("sort_start",{detail:`sort size ${querySize}`});
    const sorted = sortData(data);
    performance.mark("sort_end",{detail:`sort size ${querySize}`});

    console.log(performance.measure("db_time","db_query_start","db_query_end"));
    console.log(performance.measure("sort_time","sort_start","sort_end"));

    // clear the marks...
}

我們首先聲明查詢大小,在實(shí)際應(yīng)用程序中,它可能來自用戶的請(qǐng)求。

然后我們使用performance.mark 函數(shù)來標(biāo)記數(shù)據(jù)庫獲取和排序操作的開始和結(jié)束。最后,我們使用 performance 輸出這些事件之間的持續(xù)時(shí)間。量功能。我們得到這樣的輸出:

PerformanceMeasure {
  name: 'db_time',
  entryType: 'measure',
  startTime: 27.811830999795347,
  duration: 1.482880000025034
}
PerformanceMeasure {
  name: 'sort_time',
  entryType: 'measure',
  startTime: 29.31366699980572,
  duration: 0.09800400026142597
}

要查看這兩個(gè)操作在查詢大小增加時(shí)的表現(xiàn),我們將更改查詢大小值并記下度量值。在我的系統(tǒng)上,我得到以下內(nèi)容:

正如我們?cè)谶@里看到的,隨著查詢大小的增加,排序時(shí)間會(huì)迅速增加,首先優(yōu)化它可能更有益。通過使用一些不同的排序算法,我們得到以下內(nèi)容:

雖然對(duì)于非常小的查詢大小,排序時(shí)間略短,但與原始測(cè)量值相比,時(shí)間增長緩慢。因此,如果我們期望經(jīng)常處理大型查詢,那么在此處更改排序算法將是有益的。

同樣,我們可以測(cè)量在查詢字段上創(chuàng)建索引之前和之后數(shù)據(jù)庫獲取時(shí)間的差異。然后我們可以決定索引創(chuàng)建是否有用,或者哪些字段在用于索引時(shí)提供更多好處。

使用后臺(tái)工作程序卸載任務(wù)

在創(chuàng)建基于 UI 的應(yīng)用程序時(shí),我們需要 UI 能夠響應(yīng),即使正在進(jìn)行一些繁重的處理任務(wù)也是如此。如果在處理大數(shù)據(jù)時(shí) UI 凍結(jié),則處理起來將是一種糟糕的用戶體驗(yàn)。在網(wǎng)站上,這可以使用 Web Worker 來完成。

對(duì)于直接使用 Node 運(yùn)行的應(yīng)用程序,我們可以使用 Node 的 worker_threads 模塊將計(jì)算密集型任務(wù)卸載到后臺(tái)線程。

請(qǐng)注意,僅當(dāng)任務(wù)是 CPU 密集型任務(wù)(例如排序或解析數(shù)據(jù))時(shí),這才有用。如果任務(wù)依賴于 I/O,例如讀取文件或獲取網(wǎng)絡(luò)資源,則使用 Node 的 async-await 比使用 worker 更有效。

我們可以按如下方式創(chuàng)建和使用 worker:

const { Worker, isMainThread, parentPort, workerData, } = 
    require("node:worker_threads");

async function main() {
  const data = await fetchData(10);
  let sorted = await new Promise((resolve, reject) => {
    const worker = new Worker(__filename, {
      workerData: data,
    });
    worker.on("message", resolve);
    worker.on("error", reject);
    worker.on("exit", (code) => {
      if (code !== 0)
        reject(new Error(`Worker stopped with exit code ${code}`));
    });
  });
}
function worker() {
  const data = workerData;
  sortData(data);
  parentPort.postMessage(data);
}

if (isMainThread) {
  // we are in the main thread of our application
  main().then(() => {
    console.log("done");
  });
} else {
  // we are in the background thread spawned by the main thread
  worker();
}

我們首先從 worker_threads 模塊導(dǎo)入所需的函數(shù)和變量聲明。然后我們定義兩個(gè)函數(shù) —main(將在主線程中運(yùn)行)和 worker (將在 worker 線程中運(yùn)行)。

然后,我們檢查腳本是作為主線程還是作為 worker 線程執(zhí)行,并相應(yīng)地調(diào)用 main/worker 函數(shù)。為了簡(jiǎn)單起見,我們?cè)谝粋€(gè)文件中定義了所有這些函數(shù),但我們也可以在它們自己的文件中分離出 main 和 worker 函數(shù)。

在 main 函數(shù)中,我們像以前一樣獲取數(shù)據(jù)。然后我們創(chuàng)建一個(gè) Promise,并在其中創(chuàng)建一個(gè)新的 worker。Worker 構(gòu)造函數(shù)需要一個(gè)文件路徑,該路徑將作為Worker線程運(yùn)行。

這里我們使用 __filename builtin 給它相同的文件。在第二個(gè)參數(shù)中,我們將要排序的數(shù)據(jù)作為 workerData 傳遞。此 workerData 將由 Node 運(yùn)行時(shí)提供給 worker 線程。

最后,我們監(jiān)聽來自 worker 的事件 — 收到消息時(shí),我們解決 promise,如果出現(xiàn)錯(cuò)誤或非零退出代碼,我們拒絕 promise。

在 worker 線程中,我們從變量 workerData 中獲取從主線程傳遞的數(shù)據(jù),該變量是從 worker_threads 模塊導(dǎo)入的。在這里,我們對(duì)它進(jìn)行排序,并將一條消息發(fā)布到包含排序數(shù)據(jù)的主線程。

在主線程中,我們可以將其保存在隊(duì)列中或定期檢查它,而不是立即等待 promise。這樣,當(dāng)worker線程進(jìn)行排序計(jì)算時(shí),我們可以保持主線程的響應(yīng)性。我們還可以從 worker 線程發(fā)送中間消息,指示排序進(jìn)度。

優(yōu)化 Node 應(yīng)用程序的常見提示

雖然每個(gè)應(yīng)用程序都有自己的性能優(yōu)化方法,但Node.js應(yīng)用程序有一些常見的起點(diǎn)。

優(yōu)化前觀察

在開始優(yōu)化應(yīng)用程序之前,您必須檢測(cè)和測(cè)量應(yīng)用程序的性能,以便您可以準(zhǔn)確了解哪些函數(shù)或 API/DB 調(diào)用需要優(yōu)化。

嘗試進(jìn)行盲目?jī)?yōu)化可能會(huì)降低性能,這就是為什么使用 Node 提供的性能鉤子和 API 進(jìn)行測(cè)量是一個(gè)很好的起點(diǎn)。

有一種簡(jiǎn)單的方法來重復(fù)測(cè)量

要確定您的優(yōu)化是否有效,您應(yīng)該有一種方便的方法來衡量之前和之后的性能。

這可以通過擁有兩個(gè)構(gòu)建來完成 —--- 一個(gè)有更改,一個(gè)沒有更改,有一個(gè)運(yùn)行測(cè)試和測(cè)量的腳本,以及可以為您提供比較的東西。為更改提供明確的前后性能值可以幫助您確定這些更改是否值得。

嘗試為數(shù)據(jù)庫編制索引并緩存請(qǐng)求/響應(yīng)

如果您的應(yīng)用程序使用數(shù)據(jù)庫并頻繁查詢,則應(yīng)考慮在查詢的參數(shù)上創(chuàng)建索引,以提高檢索性能。

這將以可能增加存儲(chǔ)大小和可能增加插入/更新查詢時(shí)間為代價(jià),因此您應(yīng)該仔細(xì)衡量使用案例中的前后,并確定權(quán)衡是否良好。

提高性能的另一種方法是使用一些緩存方案,以便快速響應(yīng)數(shù)據(jù)庫或 API 查詢。如果您可以使用查詢參數(shù)緩存 API 響應(yīng),然后使用此緩存響應(yīng)以后的請(qǐng)求,則可以有效地使用它。

請(qǐng)注意,緩存是一把雙刃劍。您需要仔細(xì)評(píng)估保留緩存條目的時(shí)間、逐出條目的依據(jù)以及何時(shí)使緩存失效。錯(cuò)誤地執(zhí)行此操作不僅會(huì)降低您的性能,而且還有可能在用戶之間發(fā)送不正確的數(shù)據(jù)或泄露的數(shù)據(jù)。

減少依賴性

如果您曾經(jīng)查看 node_modules 或檢查過node_modules 所占用的磁盤大小,您就會(huì)知道 Node 項(xiàng)目中的依賴關(guān)系有多嚴(yán)重。

添加新的依賴項(xiàng)時(shí)需要小心,因?yàn)樗鼈兛赡軙?huì)添加更多的傳遞依賴項(xiàng),而解析所有這些依賴項(xiàng)可能會(huì)影響應(yīng)用程序的啟動(dòng)性能。您可以嘗試通過以下方法緩解此問題:

  • 刪除未使用的軟件包 — 有時(shí)軟件包中有多個(gè)軟件包。JSON 格式這些 ID 不再在應(yīng)用程序中使用,可以刪除。這對(duì)于縮小依賴項(xiàng)的數(shù)量和軟件包的構(gòu)建大小非常有用
  • 使用打包器對(duì)tree-shaking并從最終構(gòu)建中刪除未使用的模塊 — 在捆綁和打包應(yīng)用程序時(shí),您可以使用捆綁器提供的功能從依賴項(xiàng)中刪除未使用的模塊。您只保留代碼使用的依賴項(xiàng)部分,而不將其余部分包含在最終構(gòu)建中
  • 從依賴項(xiàng)中提供所需的特定代碼 — 當(dāng)您只需要代碼的一小部分時(shí),而不是將整個(gè)包添加為依賴項(xiàng),而是提供代碼的特定部分。執(zhí)行此操作時(shí),請(qǐng)務(wù)必檢查并遵守原始代碼的許可證
  • 延遲加載依賴項(xiàng) — 您可以延遲加載依賴項(xiàng)以提高啟動(dòng)性能,并在不需要該依賴項(xiàng)的情況下減少內(nèi)存使用量

結(jié)論

Node 提供的Performance API 不僅可以幫助確定哪些部分速度較慢,還可以幫助確定它們需要多少時(shí)間。您可以通過將這些數(shù)據(jù)作為跟蹤或指標(biāo)導(dǎo)出到Jaeger或 Prometheus 之類的內(nèi)容來進(jìn)一步探索這些數(shù)據(jù)。

請(qǐng)記住 — 擁有大量數(shù)據(jù)只會(huì)使其更難探索,因此一個(gè)好的策略是首先只測(cè)量粗略事件的時(shí)間,例如函數(shù)調(diào)用甚至請(qǐng)求的端到端處理,然后為花費(fèi)最多時(shí)間的函數(shù)添加越來越多的細(xì)粒度測(cè)量。

原文地址:https://blog.logrocket.com/node-js-performance-hooks-measurement-apis-optimize-applications/

原文作者:Yashodhan Joshi

本文譯者:一川

責(zé)任編輯:姜華 來源: 宇宙一碼平川
相關(guān)推薦

2022-02-05 21:15:59

Node.jsrequire函數(shù)

2022-09-04 15:54:10

Node.jsAPI技巧

2023-01-10 14:11:26

2022-03-08 15:13:34

Fetch APINode.js開發(fā)者

2023-04-18 15:18:10

2013-11-01 09:34:56

Node.js技術(shù)

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2019-07-09 14:50:15

Node.js前端工具

2021-12-25 22:29:57

Node.js 微任務(wù)處理事件循環(huán)

2012-02-03 09:25:39

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2021-08-20 09:00:00

Node.js開發(fā)API

2014-02-19 16:28:53

Node.jsWeb工具

2021-09-01 13:32:48

Node.jsAPI POSIX

2020-09-28 06:57:39

Node.jsGraphQLAPI

2019-02-15 10:49:37

Node.jsweb服務(wù)器

2011-09-02 14:47:48

Node

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-09 14:23:13

Node.js
點(diǎn)贊
收藏

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

欧美午夜精品一区二区| 日韩欧美精品一区二区三区经典| 国产稀缺精品盗摄盗拍| 香港久久久电影| 红桃视频成人在线观看| 欧美一级爽aaaaa大片| 日韩国产亚洲欧美| 中文字幕一区二区精品区| 亚洲成年人在线播放| 久久久久久久久久福利| 50度灰在线| 99视频热这里只有精品免费| 国产精品国语对白| 免费网站看av| 国产一区二区三区网| 欧美日韩成人综合在线一区二区| 国产视频在线观看网站| 欧美精品久久久久久久久久丰满| 精品影视av免费| 91av网站在线播放| 色哟哟一一国产精品| 亚洲精品推荐| 日韩一卡二卡三卡国产欧美| 久久综合久久色| 99riav视频在线观看| 亚洲色欲色欲www在线观看| 欧美日本韩国国产| 亚洲福利在线观看视频| 美女视频黄 久久| 韩国精品久久久999| 中国一级片在线观看| 国产欧美日韩| 亚洲精品二三区| 少妇伦子伦精品无吗| 亚洲精品三区| 欧美性感一区二区三区| 国产h视频在线播放| 亚洲综合影视| 亚洲视频图片小说| 在线一区亚洲| 9色在线观看| 国产色综合一区| 乱一区二区三区在线播放| 99热这里只有精品3| 九一久久久久久| 国产成人精品久久二区二区| youjizz在线视频| 国产情侣久久| 97国产精品久久| 国产一级视频在线| 欧美片第1页综合| 免费99精品国产自在在线| 国产激情av在线| 久久综合色占| 亚洲欧美国产视频| 少妇大叫太粗太大爽一区二区| 91精品入口| 日韩一区二区三区精品视频| 不用播放器的免费av| 成人午夜在线| 欧美人与z0zoxxxx视频| 亚洲精品久久久中文字幕| 日韩av一级| 欧美自拍偷拍一区| 性欧美1819| 精品久久亚洲| 精品国产三级a在线观看| 亚洲成人福利视频| 果冻天美麻豆一区二区国产| 亚洲激情在线观看| 日本激情小视频| 久久精品不卡| 欧美成人精品激情在线观看| 久久精品人妻一区二区三区| 欧美日韩网址| 国内久久久精品| 影音先锋在线国产| 久久精品人人| 成人美女免费网站视频| 高h震动喷水双性1v1| av成人免费在线观看| 欧美专区一二三 | 婷婷综合六月| 欧美日韩高清在线| 亚洲美女精品视频| 久久99影视| 免费91麻豆精品国产自产在线观看| 精品视频在线观看免费| 久久综合影视| 亚洲xxx自由成熟| 深夜福利在线视频| 国产精品二区一区二区aⅴ污介绍| 91精品一区二区三区四区| 交100部在线观看| 欧美日韩日日摸| 日韩女优在线视频| 日本久久一二三四| 午夜精品久久久久久久白皮肤 | 欧美高清性xxxxhd| 黄色小网站在线观看| 欧美日韩国产丝袜另类| 最新天堂中文在线| 美女主播精品视频一二三四| 综合欧美国产视频二区| 日韩女优在线观看| 精品综合免费视频观看| 女女同性女同一区二区三区91| 黄色网在线看| 在线观看日韩高清av| 亚洲成人av免费观看| 激情综合网站| 午夜精品福利视频| 国产伦精品一区二区三区四区 | 国产精品一二三四| 视频在线一区二区三区| cao在线视频| 91精品国产综合久久小美女| 亚洲天堂久久新| 欧美另类专区| 国产在线日韩在线| 国产黄在线看| 精品国产乱码久久久久久天美| 成人性生交视频免费观看| 精品精品久久| 欧美在线亚洲在线| 日本激情一区二区| 亚洲一区二区三区三| 久久久九九九热| 91麻豆国产自产在线观看亚洲| 日本精品免费观看| 亚州av在线播放| 亚洲成人av电影| 久久久久国产免费| 综合激情在线| 51蜜桃传媒精品一区二区| 欧美成人xxx| 欧美三级电影网站| 国产又黄又粗的视频| 久久国产一二区| 蜜桃999成人看片在线观看| 24小时免费看片在线观看| 日韩一本二本av| 黄色一级片中国| 国产麻豆精品在线| www.99riav| 亚洲超碰在线观看| 久久99精品久久久久久噜噜| 99国产精品久久久久99打野战| 中文字幕一区二区三区视频| 国产永久免费网站| 91精品一区二区三区综合| 国产综合香蕉五月婷在线| 色网站免费在线观看| 欧美精品色一区二区三区| 中文字幕观看av| 国产呦精品一区二区三区网站| 穿情趣内衣被c到高潮视频| 久久九九精品视频| 九九视频这里只有精品| 韩国av永久免费| 亚洲成av人片一区二区梦乃| 亚洲欧美在线不卡| 久久这里只有| 在线观看欧美激情| 日韩在线网址| 午夜精品理论片| 九色网友自拍视频手机在线| 欧美日韩精品免费观看视频| 欧美国产日韩在线观看成人| 成人国产精品免费观看视频| 免费黄色特级片| 天天综合网网欲色| 成人av资源| 亚洲欧美韩国| 最近2019年手机中文字幕| 国产精品探花视频| 亚洲韩国一区二区三区| 亚洲精品理论片| 美女视频网站久久| 国产高清av在线播放| 久久99性xxx老妇胖精品| 96精品久久久久中文字幕| av第一福利在线导航| 亚洲午夜精品久久久久久性色| 国产一区二区三区在线观看| 亚洲伊人伊色伊影伊综合网| 免费在线观看污| 国产激情视频一区二区三区欧美 | 日本美女一区二区三区| 青少年xxxxx性开放hg| 美女视频亚洲色图| 成人a在线视频| 华人av在线| 在线免费看av不卡| 刘亦菲久久免费一区二区| 欧美中文字幕久久| 久久中文字幕在线观看| 欧美激情综合网| 国产精品久久久久久亚洲av| 三级久久三级久久久| 激情五月六月婷婷| 成人激情免费视频| 狠狠久久综合婷婷不卡| 成人51免费| 国产精品精品一区二区三区午夜版 | 国产suv一区二区| 色琪琪一区二区三区亚洲区| 欧美黄色免费观看| 国产精品你懂的| 丰满少妇在线观看资源站| 国产在线精品免费| 亚洲最大综合网| 国产精品日韩欧美一区| 日韩欧美视频免费在线观看| 日韩久久电影| 欧美影视一区二区| 欧美1区2区3区4区| 91影院未满十八岁禁止入内| 久久er热在这里只有精品66| 欧美亚洲国产视频| 丰满的护士2在线观看高清| 久久亚洲综合国产精品99麻豆精品福利 | 精品小视频在线| 亚洲av无码片一区二区三区| 777精品伊人久久久久大香线蕉| 精人妻无码一区二区三区| 午夜日韩在线电影| 欧美黄片一区二区三区| 国产精品超碰97尤物18| 欧美亚洲色综久久精品国产| 久久人人97超碰com| 国产福利在线观看视频| 成人深夜视频在线观看| 色婷婷狠狠18禁久久| 国产精品 欧美精品| 操人视频免费看| 国产乱码一区二区三区| 国产无遮挡猛进猛出免费软件 | 成人午夜电影在线播放| 国产午夜久久av| 91九色单男在线观看| 日韩久久一区| 成人久久久久久| 免费观看亚洲天堂| 91欧美视频网站| 玖玖精品一区| 18成人在线| 亚洲综合网狠久久| 粉嫩av四季av绯色av第一区| julia中文字幕一区二区99在线| 亚洲字幕在线观看| av男人一区| 精品久久久久久一区| 亚洲最好看的视频| 亚洲高清视频在线观看| 欧美wwwww| 久久人妻无码一区二区| 黄色成人av网站| 欧美二区在线视频| 天堂久久久久va久久久久| www亚洲成人| 国产麻豆91精品| 亚洲自拍偷拍精品| 久久久午夜精品| 国产一区在线观看免费| 亚洲精品日韩综合观看成人91| 久草网在线观看| 欧美三级免费观看| 在线视频播放大全| 日韩一级视频免费观看在线| 人妻偷人精品一区二区三区| 亚洲美女视频网| 麻豆传媒视频在线| 久久久久久香蕉网| 浪潮色综合久久天堂| 成人国产精品免费视频| 久久1电影院| 亚洲精品成人a8198a| 午夜日韩av| 国产综合免费视频| 国产伦精品一区二区三区免费| 亚洲中文字幕一区| 国产精品污www在线观看| 爱爱视频免费在线观看| 精品国产乱码久久久久久婷婷| 怡红院成永久免费人全部视频| 日韩欧美激情在线| 成年人在线观看网站| 色与欲影视天天看综合网| 激情开心成人网| 3d动漫啪啪精品一区二区免费| 亚洲人和日本人hd| 亚洲高潮无码久久| 香蕉久久夜色精品国产| 国产成人强伦免费视频网站| 国产亚洲欧美日韩在线一区| 在线免费观看亚洲视频| 色噜噜狠狠色综合欧洲selulu| 国产按摩一区二区三区| 亚洲视屏在线播放| 超碰在线网站| 成人在线视频福利| 亚洲人成网www| 精品无码国产一区二区三区av| 久久99精品久久久久婷婷| 亚洲精品视频大全| 亚洲激情自拍偷拍| 亚洲天堂网在线视频| 国产视频精品免费播放| 羞羞网站在线看| 国产免费成人av| 亚洲综合福利| www.中文字幕在线| 国产福利一区在线| 182在线观看视频| 欧美丝袜第三区| 毛片在线播放网址| 98精品国产高清在线xxxx天堂| 欧美三级一区| 正在播放一区| 美洲天堂一区二卡三卡四卡视频 | 亚洲天堂精品视频| 亚洲中文无码av在线| 亚洲精品中文字幕av| 大菠萝精品导航| 动漫精品视频| 欧美日韩国产在线一区| 国产毛片久久久久久| 国产精品久久久久久久岛一牛影视| 蜜臀99久久精品久久久久小说| 亚洲国产精品热久久| 国产ktv在线视频| 国产嫩草一区二区三区在线观看| 欧美激情 亚洲a∨综合| 亚洲黄色av片| 亚洲精品国产精品乱码不99 | 国产成人77亚洲精品www| 日韩成人在线资源| 青青草国产精品亚洲专区无| 男人舔女人下部高潮全视频 | 99国产在线播放| 久久精品视频播放| 国产精品亚洲一区二区在线观看| 一级做a爰片久久| 国内精品免费**视频| 黑鬼狂亚洲人videos| 日韩一区二区免费在线观看| 中文字幕免费高清电视剧网站在线观看| 91天堂在线观看| 韩国在线一区| youjizz.com国产| 精品福利在线视频| 免费毛片在线| 国产美女91呻吟求| 一区二区三区四区日韩| 午夜性福利视频| 大桥未久av一区二区三区| 你懂的视频在线观看| 国产精品美女久久| 婷婷另类小说| 在线精品视频播放| 粉嫩老牛aⅴ一区二区三区| 猫咪在线永久网站| 国产经典一区二区| 久久视频在线| 国产乱国产乱老熟300部视频| 五月天欧美精品| av在线免费观看网站| 91系列在线观看| 亚洲人成人一区二区三区| 在线免费观看日韩av| 欧美日本在线一区| 久久大胆人体| 欧美激情一区二区三区在线视频| 男女性色大片免费观看一区二区| av黄色免费在线观看| 精品99一区二区| 先锋欧美三级| 国产91沈先生在线播放| 久久综合色一综合色88| 国产一区二区三区视频免费观看| 久久久免费高清电视剧观看| 欧美亚洲激情| 涩视频在线观看| 欧美在线短视频| 欧美aaaaaaa| 亚洲 国产 日韩 综合一区| 国产精品18久久久久久久久久久久| 91在线视频在线观看| 久久亚洲欧美日韩精品专区| 小嫩嫩12欧美| 国产又黄又嫩又滑又白| 色哟哟一区二区三区| 羞羞视频在线观看免费| 视频一区视频二区视频三区高| 国产成a人亚洲精品| 最近中文字幕在线视频| 久久免费视频在线观看| 91日韩视频| 91精品人妻一区二区三区|