精品欧美一区二区三区在线观看 _久久久久国色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)

国产成人免费视频精品含羞草妖精| 欧美日韩在线网站| 精品色蜜蜜精品视频在线观看| 九九九九精品九九九九| 欧美人一级淫片a免费播放| 91亚洲国产成人久久精品| 日韩亚洲欧美综合| 国模杨依粉嫩蝴蝶150p| a级网站在线播放| 94色蜜桃网一区二区三区| 国产精品国内视频| 国产福利久久久| 成人在线免费视频观看| 日韩精品专区在线影院观看 | 青梅竹马是消防员在线| 久久国产精品免费| 51午夜精品视频| 日韩欧美国产成人精品免费| 久久精品论坛| 日韩一区二区三区av| 2022亚洲天堂| 色婷婷av在线| 中文字幕一区免费在线观看| 欧美日韩电影一区二区| 狠狠综合久久av一区二区| 秋霞电影一区二区| 欧美一区二三区| 激情综合网五月天| 欧美国产一级| 伊人久久男人天堂| 亚洲国产av一区| 久久亚洲黄色| 日韩三级视频在线看| 日本一二区免费| 黄色精品视频| 色88888久久久久久影院野外| 美女av免费观看| 国产在线高清视频| 国产精品视频观看| 亚洲五月六月| 成人高清免费观看mv| 久久综合色一综合色88| 国产一区二区三区四区五区在线| 国产黄色一区二区| 狠狠狠色丁香婷婷综合激情| 国产精品一区二区3区| 天天综合久久综合| 日韩国产精品久久久| 国产成人精品999| 国产又黄又爽又色| 午夜在线精品偷拍| 国产97在线亚洲| 极品国产91在线网站| 麻豆91精品| 日韩美女毛茸茸| 国产主播第一页| 久久综合伊人| 国产精品久久久久久久天堂| 中文字幕你懂的| 久久久久中文| 国产精品一区av| 国产乱淫a∨片免费视频| 国产在线观看免费一区| 91免费综合在线| 亚洲黄色小说网| av网站一区二区三区| 久久久久成人精品免费播放动漫| 日本福利在线观看| 久久精品男人天堂av| 一区二区三区电影| 成人av福利| 亚洲成人动漫在线观看| 无码人妻丰满熟妇区五十路百度| 国产另类xxxxhd高清| 欧美疯狂做受xxxx富婆| 亚洲天堂小视频| 婷婷国产精品| 色哟哟入口国产精品| 青青草手机在线观看| 国产欧美高清| 国产欧美一区二区三区四区| 性色av蜜臀av| 久久奇米777| 伊甸园精品99久久久久久| 超碰porn在线| 欧美日韩综合视频网址| 欧美日韩亚洲自拍| 亚洲视频国产| 国产一区二区三区在线| 欧美三级小视频| 久久精品30| 91视频8mav| 理论在线观看| 亚洲久草在线视频| 日本黄色三级大片| 国产高清视频一区二区| 国产婷婷色综合av蜜臀av| 久久国产高清视频| 国产精品一页| 91精品国产99久久久久久红楼| 无码精品一区二区三区在线| 中文字幕在线观看一区| 欧美成人免费在线观看视频| jizz久久久久久| 亚洲国产91精品在线观看| 久久精品三级视频| 99在线|亚洲一区二区| 国产免费久久av| 青青草视频在线免费观看| 亚洲欧美激情在线| 国产裸体免费无遮挡| 成人自拍在线| 久久综合久中文字幕青草| 高清乱码免费看污| 成人免费视频免费观看| 亚洲欧洲三级| 日韩性xxx| 亚洲国产成人精品一区二区 | 亚洲欧美区自拍先锋| 少妇激情一区二区三区| 老司机凹凸av亚洲导航| 欧美激情乱人伦一区| 97caocao| 欧美激情一区二区三区蜜桃视频 | 老司机精品视频在线| 精品视频一区二区| 久久av色综合| 日韩一卡二卡三卡四卡| 日本 欧美 国产| 免费在线成人网| 日本成人黄色免费看| 免费在线小视频| 精品美女一区二区| 久久黄色小视频| 国产精品一二三四| 中文字幕一区二区三区四区五区人| 成人看片网页| 亚洲视频欧洲视频| 一级一片免费看| 久久久亚洲国产美女国产盗摄| 欧美 日韩 亚洲 一区| 97久久综合区小说区图片区| 另类专区欧美制服同性| 国产精品久久777777换脸| 国产精品免费人成网站| 日本不卡一区二区在线观看| 93在线视频精品免费观看| 国产女精品视频网站免费| 在线激情网站| 69久久99精品久久久久婷婷| 性生交大片免费全黄| 韩国一区二区在线观看| 日韩中文在线字幕| 日韩中文一区二区| 高清欧美性猛交xxxx| 天天插天天干天天操| 午夜精品久久久久影视| 国产麻豆xxxvideo实拍| 久久精品国产清高在天天线| 欧洲成人一区二区| 日韩一区二区三区在线免费观看| 一区二区三区回区在观看免费视频| 成人免费毛片男人用品| 国产精品久久久久久久久免费桃花 | 国产三级视频网站| 日韩 欧美一区二区三区| 亚洲永久激情精品| 欧美视频三区| 97视频在线看| 成年人免费在线视频| 7777精品伊人久久久大香线蕉完整版| 女同久久另类69精品国产| 国产一区二区三区黄视频| r级无码视频在线观看| 免费一区二区三区视频导航| 国产欧美日韩视频| 新版中文在线官网| 国产偷亚洲偷欧美偷精品| 中文字幕一区二区三区波野结| 亚洲天堂免费看| 99re久久精品国产| 日本成人在线不卡视频| 日韩精品免费一区| 蜜桃一区二区| 亚洲综合小说区| 无遮挡爽大片在线观看视频| 中文字幕亚洲一区| 嫩草影院一区二区| 欧美在线啊v一区| 久久网一区二区| 国产女人18毛片水真多成人如厕| 自拍一级黄色片| 亚洲欧美视频| 91大学生片黄在线观看| 九九热线有精品视频99| 3d蒂法精品啪啪一区二区免费| 日本不卡1234视频| 萌白酱国产一区二区| 九色在线视频| 精品国产三级a在线观看| 波多野结衣不卡| 亚洲成人av在线电影| 正在播放国产对白害羞| 成人av在线看| 国产精品嫩草影视| 日本欧洲一区二区| 中文字幕无码精品亚洲35| 国产精品久久久乱弄| 蜜桃av噜噜一区二区三| xxxx日韩| 99久久伊人精品影院| 日韩三区免费| 欧美亚洲一区在线| 影音先锋男人资源在线| 日韩在线中文视频| 国产福利电影在线| 亚洲精品成人av| 囯产精品久久久久久| 欧美一区二区三区视频在线观看| 四虎影院在线免费播放| 亚洲成人动漫一区| 国产亚洲成人av| 亚洲视频1区2区| 中国美女黄色一级片| 久久久久久久久岛国免费| 国产a级黄色片| 国产成人av影院| 中文字幕色网站| 国内精品不卡在线| 在线观看国产福利| 精品一区二区在线观看| 亚洲一级免费在线观看| 奇米精品一区二区三区在线观看一| 一本大道熟女人妻中文字幕在线| 精品av久久久久电影| 二级片在线观看| 91精品观看| 中文字幕日韩一区二区三区不卡| 日韩av在线中文字幕| 亚洲免费久久| 91视频精品| 最新av在线免费观看| 亚洲色图国产| 日韩成人午夜影院| 欧美日韩视频一区二区三区| av影院在线播放| 红桃视频国产一区| 被灌满精子的波多野结衣| 亚洲福利国产| 精品中文字幕av| 久久久久国产精品一区二区 | 国产在线麻豆精品观看| 三日本三级少妇三级99| 国产91精品露脸国语对白| 野战少妇38p| 91老师国产黑色丝袜在线| 中日韩精品一区二区三区 | 亚洲精品一品区二品区三品区 | 一级黄色片在线播放| 欧美日本在线一区| aaa级黄色片| 亚洲精品国产福利| 日本国产在线| 日韩性xxxx爱| 日本乱理伦在线| 8x海外华人永久免费日韩内陆视频| 末成年女av片一区二区下载| 国产福利视频一区| 91精品亚洲一区在线观看| 风间由美久久久| 图片婷婷一区| 中文字幕精品一区日韩| 亚洲福利专区| 九九九在线观看视频| 国产一区二区三区四区在线观看| 波多野结衣电影免费观看| 91在线视频官网| 免费一级suv好看的国产网站| 亚洲美女偷拍久久| 五月天激情国产综合婷婷婷| 欧美日韩国产区一| 黄色a在线观看| 在线视频欧美日韩| 人人超在线公开视频| 人妖精品videosex性欧美| 欧美亚洲黄色| 黑人另类av| 欧美韩国日本在线观看| 99久久国产综合精品五月天喷水| 日韩不卡免费视频| 少妇搡bbbb搡bbb搡打电话| 日本一区二区三区久久久久久久久不 | 亚洲欧美激情小说另类| 国产精品suv一区二区三区| 在线成人小视频| 欧洲视频在线免费观看| 久久综合伊人77777| 亚洲天堂一区二区| 翡翠波斯猫1977年美国| 色综合久久网| 成人小视频在线看| 懂色一区二区三区免费观看| 波多野结衣家庭教师在线观看| 精品久久久久久久中文字幕| 国产乱人乱偷精品视频| 国产一区二区三区直播精品电影| 色老头在线观看| 国产精品免费一区| 欧美大胆a级| 在线观看三级网站| 人人超碰91尤物精品国产| 精品人妻少妇嫩草av无码| 一区二区三区在线视频免费 | 国产精品99久久久久久似苏梦涵 | 日韩啪啪电影网| 日韩一级免费在线观看| www.视频一区| 久操免费在线视频| 337p亚洲精品色噜噜| 成人午夜电影在线观看| 青青久久av北条麻妃海外网| 九色丨蝌蚪丨成人| 日本阿v视频在线观看| 狠狠色狠狠色综合日日91app| 九九九视频在线观看| 狠狠躁18三区二区一区| 视频污在线观看| 韩国三级日本三级少妇99| 亚洲小说春色综合另类电影| 好色先生视频污| 国产一区二区中文字幕| 美女三级黄色片| 8v天堂国产在线一区二区| 日本三级在线播放完整版| 国产精品久久久久久久久影视| 激情五月色综合国产精品| 久久精品99国产| 久久久久亚洲蜜桃| 无码人妻精品一区二| 亚洲新声在线观看| 欧美国产日韩电影| 亚洲高清123| 久久精品国产色蜜蜜麻豆| 美国黄色片视频| 日韩一区二区三区观看| 日本h片在线| 精品国产第一页| 久久电影一区| 天天操天天舔天天射| 欧美日韩不卡在线| 在线播放蜜桃麻豆| 国产一级精品aaaaa看| 先锋影音久久| www.99热| 欧美日本国产视频| 性欧美video高清bbw| 国产精品久久久久久久久久久久午夜片 | 欧美成人免费小视频| 97人人澡人人爽91综合色| 国产精品免费入口| 国产日韩欧美不卡| 一级黄色片在线观看| 久久久久久久成人| 欧美禁忌电影网| 97超碰成人在线| 亚洲福利视频三区| 国产在线一二三区| 91久久久久久久久久久| 亚洲经典三级| 久久久免费看片| 欧美成人国产一区二区| 日本乱码一区二区三区不卡| 日日噜噜噜噜夜夜爽亚洲精品| 国产一区二区影院| 亚洲图片在线视频| 另类色图亚洲色图| 亚洲视频分类| 亚洲三级在线观看视频| 亚洲第一福利一区| 国产精品秘入口| 91免费版黄色| 老司机精品导航| 久草中文在线视频| 亚洲人成在线播放| 午夜电影一区| 国产天堂在线播放| 亚洲超碰精品一区二区| 第三区美女视频在线| 国产精品伊人日日| 日韩电影在线观看电影| 久久网中文字幕| 一区二区在线视频播放| 国产一区二区三区亚洲| 日本人69视频| 欧美性高潮床叫视频| av免费在线网站| 亚洲精品二区| 久久综合色综合88| 亚洲精品无码久久久| 国产精品欧美一区二区|