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

用Node.js編寫內(nèi)存效率高的應(yīng)用程序

開發(fā) 前端
在本文中,我們通過解決一個(gè)問題來了解 NodeJS 的流、緩沖區(qū)和管道等結(jié)構(gòu),并了解它們分別如何支持編寫內(nèi)存有效的應(yīng)用程序。

 [[312999]]

一座被設(shè)計(jì)為能避開氣流的建筑 (https://pixelz.cc)

軟件應(yīng)用程序在計(jì)算機(jī)的主存儲(chǔ)器中運(yùn)行,我們稱之為隨機(jī)存取存儲(chǔ)器(RAM)。JavaScript,尤其是 NodeJS (服務(wù)端 JS)允許我們?yōu)榻K端用戶編寫從小型到大型的軟件項(xiàng)目。處理程序的內(nèi)存總是一個(gè)棘手的問題,因?yàn)樵愀獾膶?shí)現(xiàn)可能會(huì)阻塞在給定服務(wù)器或系統(tǒng)上運(yùn)行的所有其他應(yīng)用程序。C 和 C++ 程序員確實(shí)關(guān)心內(nèi)存管理,因?yàn)殡[藏在代碼的每個(gè)角落都有可能出現(xiàn)可怕的內(nèi)存泄漏。但是對于 JS 開發(fā)者來說,你真的有關(guān)心過這個(gè)問題嗎?

由于 JS 開發(fā)人員通常在專用的高容量服務(wù)器上進(jìn)行 web 服務(wù)器編程,他們可能不會(huì)察覺多任務(wù)處理的延遲。比方說在開發(fā) web 服務(wù)器的情況下,我們也會(huì)運(yùn)行多個(gè)應(yīng)用程序,如數(shù)據(jù)庫服務(wù)器( MySQL )、緩存服務(wù)器( Redis )和其他需要的應(yīng)用。我們需要知道它們也會(huì)消耗可用的主內(nèi)存。如果我們隨意地編寫應(yīng)用程序,很可能會(huì)降低其他進(jìn)程的性能,甚至讓內(nèi)存完全拒絕對它們的分配。在本文中,我們通過解決一個(gè)問題來了解 NodeJS 的流、緩沖區(qū)和管道等結(jié)構(gòu),并了解它們分別如何支持編寫內(nèi)存有效的應(yīng)用程序。

我們使用 NodeJS v8.12.0 來運(yùn)行這些程序,所有代碼示例都放在這里:

narenaryan/node-backpressure-internals

原文鏈接:Writing memory efficient software applications in Node.js 

問題:大文件復(fù)制

如果有人被要求用 NodeJS 寫一段文件復(fù)制的程序,那么他會(huì)迅速寫出下面這段代碼: 

  1. const fs = require('fs');  
  2. let fileName = process.argv[2];  
  3. let destPath = process.argv[3];  
  4. fs.readFile(fileName, (err, data) => {  
  5.     if (err) throw err;  
  6.     fs.writeFile(destPath || 'output', data, (err) => {  
  7.         if (err) throw err;  
  8.     });   
  9.     console.log('New file has been created!');  
  10. }); 

這段代碼簡單地根據(jù)輸入的文件名和路徑,在嘗試對文件讀取后把它寫入目標(biāo)路徑,這對于小文件來說是不成問題的。

現(xiàn)在假設(shè)我們有一個(gè)大文件(大于4 GB)需要用這段程序來進(jìn)行備份。就以我的一個(gè)達(dá) 7.4G 的超高清4K 電影為例子好了,我用上述的程序代碼把它從當(dāng)前目錄復(fù)制到別的目錄。 

  1. $ node basic_copy.js cartoonMovie.mkv ~/Documents/bigMovie.mkv 

然后在 Ubuntu(Linux )系統(tǒng)下我得到了這段報(bào)錯(cuò): 

  1. /home/shobarani/Workspace/basic_copy.js:7  
  2.     if (err) throw err;  
  3.              ^  
  4. RangeError: File size is greater than possible Buffer: 0x7fffffff bytes  
  5.     at FSReqWrap.readFileAfterStat [as oncomplete] (fs.js:453:11) 

正如你看到的那樣,由于 NodeJS 最大只允許寫入 2GB 的數(shù)據(jù)到它的緩沖區(qū),導(dǎo)致了錯(cuò)誤發(fā)生在讀取文件的過程中。為了解決這個(gè)問題,當(dāng)你在進(jìn)行 I/O 密集操作的時(shí)候(復(fù)制、處理、壓縮等),最好考慮一下內(nèi)存的情況。

NodeJS 中的 Streams 和 Buffers

為了解決上述問題,我們需要一個(gè)辦法把大文件切成許多文件塊,同時(shí)需要一個(gè)數(shù)據(jù)結(jié)構(gòu)去存放這些文件塊。一個(gè) buffer 就是用來存儲(chǔ)二進(jìn)制數(shù)據(jù)的結(jié)構(gòu)。接下來,我們需要一個(gè)讀寫文件塊的方法,而 Streams 則提供了這部分能力。

Buffers(緩沖區(qū))

我們能夠利用 Buffer 對象輕松地創(chuàng)建一個(gè) buffer。 

  1. let buffer = new Buffer(10); # 10 為 buffer 的體積  
  2. console.log(buffer); # prints <Buffer 00 00 00 00 00 00 00 00 00 00> 

在新版本的 NodeJS (>8)中,你也可以這樣寫。 

  1. let buffer = new Buffer.alloc(10);  
  2. console.log(buffer); # prints <Buffer 00 00 00 00 00 00 00 00 00 00> 

如果我們已經(jīng)有了一些數(shù)據(jù),比如數(shù)組或者別的數(shù)據(jù)集,我們可以為它們創(chuàng)建一個(gè) buffer。 

  1. let name = 'Node JS DEV' 
  2. let buffer = Buffer.from(name);  
  3. console.log(buffer) # prints <Buffer 4e 6f 64 65 20 4a 53 20 44 45 5> 

Buffers 有一些如 buffer.toString() 和 buffer.toJSON() 之類的重要方法,能夠深入到其所存儲(chǔ)的數(shù)據(jù)當(dāng)中去。

我們不會(huì)為了優(yōu)化代碼而去直接創(chuàng)建原始 buffer。NodeJS 和 V8 引擎在處理 streams 和網(wǎng)絡(luò) socket 的時(shí)候就已經(jīng)在創(chuàng)建內(nèi)部緩沖區(qū)(隊(duì)列)中實(shí)現(xiàn)了這一點(diǎn)。

Streams(流)

簡單來說,流就像 NodeJS 對象上的任意門。在計(jì)算機(jī)網(wǎng)絡(luò)中,入口是一個(gè)輸入動(dòng)作,出口是一個(gè)輸出動(dòng)作。我們接下來將繼續(xù)使用這些術(shù)語。

流的類型總共有四種:

  •  可讀流(用于讀取數(shù)據(jù))
  •  可寫流(用于寫入數(shù)據(jù))
  •  雙工流(同時(shí)可用于讀寫)
  •  轉(zhuǎn)換流(一種用于處理數(shù)據(jù)的自定義雙工流,如壓縮,檢查數(shù)據(jù)等)

下面這句話可以清晰地闡述為什么我們應(yīng)該使用流。

Stream API (尤其是 stream.pipe() 方法)的一個(gè)重要目標(biāo)是將數(shù)據(jù)緩沖限制在可接受的水平,這樣不同速度的源和目標(biāo)就不會(huì)阻塞可用內(nèi)存。

我們需要一些辦法去完成任務(wù)而不至于壓垮系統(tǒng)。這也是我們在文章開頭就已經(jīng)提到過的。

上面的示意圖中我們有兩個(gè)類型的流,分別是可讀流和可寫流。.pipe() 方法是一個(gè)非常基本的方法,用于連接可讀流和可寫流。如果你不明白上面的示意圖,也沒關(guān)系,在看完我們的例子以后,你可以回到示意圖這里來,那個(gè)時(shí)候一切都會(huì)顯得理所當(dāng)然。管道是一種引人注目的機(jī)制,下面我們用兩個(gè)例子來說明它。

解法1(簡單地使用流來復(fù)制文件)

讓我們設(shè)計(jì)一種解法來解決前文中大文件復(fù)制的問題。首先我們要?jiǎng)?chuàng)建兩個(gè)流,然后執(zhí)行接下來的幾個(gè)步驟。

  1.  監(jiān)聽來自可讀流的數(shù)據(jù)塊
  2.  把數(shù)據(jù)塊寫進(jìn)可寫流
  3.  跟蹤文件復(fù)制的進(jìn)度

我們把這段代碼命名為 streams_copy_basic.js 

  1. /*  
  2.     A file copy with streams and events - Author: Naren Arya  
  3. */  
  4. const stream = require('stream');  
  5. const fs = require('fs');  
  6. let fileName = process.argv[2];  
  7. let destPath = process.argv[3];  
  8. const readabale = fs.createReadStream(fileName);  
  9. const writeable = fs.createWriteStream(destPath || "output");  
  10. fs.stat(fileName, (err, stats) => {  
  11.     this.fileSize = stats.size;  
  12.     this.counter = 1 
  13.     this.fileArray = fileName.split('.');     
  14.     try {  
  15.         this.duplicate = destPath + "/" + this.fileArray[0] + '_Copy.' + this.fileArray[1];  
  16.     } catch(e) {  
  17.         console.exception('File name is invalid! please pass the proper one');  
  18.     }    
  19.     process.stdout.write(`File: ${this.duplicate} is being created:`);    
  20.     readabale.on('data', (chunk)=> {  
  21.         let percentageCopied = ((chunk.length * this.counter) / this.fileSize) * 100;  
  22.         process.stdout.clearLine();  // clear current text  
  23.         process.stdout.cursorTo(0);  
  24.         process.stdout.write(`${Math.round(percentageCopied)}%`);  
  25.         writeable.write(chunk);  
  26.         this.counter += 1;  
  27.     });    
  28.     readabale.on('end', (e) => {  
  29.         process.stdout.clearLine();  // clear current text  
  30.         process.stdout.cursorTo(0);  
  31.         process.stdout.write("Successfully finished the operation");  
  32.         return;  
  33.     });    
  34.     readabale.on('error', (e) => {  
  35.         console.log("Some error occured: ", e);  
  36.     });     
  37.     writeable.on('finish', () => { 
  38.         console.log("Successfully created the file copy!");  
  39.     });     
  40. }); 

 

在這段程序中,我們接收用戶傳入的兩個(gè)文件路徑(源文件和目標(biāo)文件),然后創(chuàng)建了兩個(gè)流,用于把數(shù)據(jù)塊從可讀流運(yùn)到可寫流。然后我們定義了一些變量去追蹤文件復(fù)制的進(jìn)度,然后輸出到控制臺(此處為 console)。與此同時(shí)我們還訂閱了一些事件:

data:當(dāng)一個(gè)數(shù)據(jù)塊被讀取時(shí)觸發(fā)

end:當(dāng)一個(gè)數(shù)據(jù)塊被可讀流所讀取完的時(shí)候觸發(fā)

error:當(dāng)讀取數(shù)據(jù)塊的時(shí)候出錯(cuò)時(shí)觸發(fā)

運(yùn)行這段程序,我們可以成功地完成一個(gè)大文件(此處為7.4 G)的復(fù)制任務(wù)。 

  1. $ time node streams_copy_basic.js cartoonMovie.mkv ~/Documents/4kdemo.mkv 

然而,當(dāng)我們通過任務(wù)管理器觀察程序在運(yùn)行過程中的內(nèi)存狀況時(shí),依舊有一個(gè)問題。

4.6GB?我們的程序在運(yùn)行時(shí)所消耗的內(nèi)存,在這里是講不通的,以及它很有可能會(huì)卡死其他的應(yīng)用程序。

發(fā)生了什么?

如果你有仔細(xì)觀察上圖中的讀寫率,你會(huì)發(fā)現(xiàn)一些端倪。

Disk Read: 53.4 MiB/s

Disk Write: 14.8 MiB/s

這意味著生產(chǎn)者正在以更快的速度生產(chǎn),而消費(fèi)者無法跟上這個(gè)速度。計(jì)算機(jī)為了保存讀取的數(shù)據(jù)塊,將多余的數(shù)據(jù)存儲(chǔ)到機(jī)器的RAM中。這就是RAM出現(xiàn)峰值的原因。

上述代碼在我的機(jī)器上運(yùn)行了3分16秒…… 

  1. 17.16s user 25.06s system 21% cpu 3:16.61 total 

解法2(基于流和自動(dòng)背壓的文件復(fù)制)

為了克服上述問題,我們可以修改程序來自動(dòng)調(diào)整磁盤的讀寫速度。這個(gè)機(jī)制就是背壓。我們不需要做太多,只需將可讀流導(dǎo)入可寫流即可,NodeJS 會(huì)負(fù)責(zé)背壓的工作。

讓我們將這個(gè)程序命名為 streams_copy_efficient.js 

  1. /*  
  2.     A file copy with streams and piping - Author: Naren Arya  
  3. */  
  4. const stream = require('stream');  
  5. const fs = require('fs');  
  6. let fileName = process.argv[2];  
  7. let destPath = process.argv[3];  
  8. const readabale = fs.createReadStream(fileName);  
  9. const writeable = fs.createWriteStream(destPath || "output");  
  10. fs.stat(fileName, (err, stats) => {  
  11.     this.fileSize = stats.size;  
  12.     this.counter = 1 
  13.     this.fileArray = fileName.split('.');   
  14.     try {  
  15.         this.duplicate = destPath + "/" + this.fileArray[0] + '_Copy.' + this.fileArray[1];  
  16.     } catch(e) {  
  17.         console.exception('File name is invalid! please pass the proper one');  
  18.     }     
  19.     process.stdout.write(`File: ${this.duplicate} is being created:`);   
  20.     readabale.on('data', (chunk) => {  
  21.         let percentageCopied = ((chunk.length * this.counter) / this.fileSize) * 100;  
  22.         process.stdout.clearLine();  // clear current text  
  23.         process.stdout.cursorTo(0);  
  24.         process.stdout.write(`${Math.round(percentageCopied)}%`);  
  25.         this.counter += 1;  
  26.     });     
  27.     readabale.pipe(writeable); // Auto pilot ON!     
  28.     // In case if we have an interruption while copying  
  29.     writeable.on('unpipe', (e) => {  
  30.         process.stdout.write("Copy has failed!");  
  31.     });     
  32. }); 

在這個(gè)例子中,我們用一句代碼替換了之前的數(shù)據(jù)塊寫入操作。 

  1. readabale.pipe(writeable); // Auto pilot ON! 

這里的 pipe 就是所有魔法發(fā)生的原因。它控制了磁盤讀寫的速度以至于不會(huì)阻塞內(nèi)存(RAM)。

運(yùn)行一下。 

  1. $ time node streams_copy_efficient.js cartoonMovie.mkv ~/Documents/4kdemo.mkv 

我們復(fù)制了同一個(gè)大文件(7.4 GB),讓我們來看看內(nèi)存利用率。

震驚!現(xiàn)在 Node 程序僅僅占用了61.9 MiB 的內(nèi)存。如果你觀察到讀寫速率的話:

Disk Read: 35.5 MiB/s

Disk Write: 35.5 MiB/s

在任意給定的時(shí)間內(nèi),因?yàn)楸硥旱拇嬖冢x寫速率得以保持一致。更讓人驚喜的是,這段優(yōu)化后的程序代碼整整比之前的快了13秒。 

  1. 12.13s user 28.50s system 22% cpu 3:03.35 total 

由于 NodeJS 流和管道,內(nèi)存負(fù)載減少了98.68%,執(zhí)行時(shí)間也減少了。這就是為什么管道是一個(gè)強(qiáng)大的存在。

61.9 MiB 是由可讀流創(chuàng)建的緩沖區(qū)大小。我們還可以使用可讀流上的 read 方法為緩沖塊分配自定義大小。 

  1. const readabale = fs.createReadStream(fileName);  
  2. readable.read(no_of_bytes_size); 

除了本地文件的復(fù)制以外,這個(gè)技術(shù)還可以用于優(yōu)化許多 I/O 操作的問題:

  •  處理從卡夫卡到數(shù)據(jù)庫的數(shù)據(jù)流
  •  處理來自文件系統(tǒng)的數(shù)據(jù)流,動(dòng)態(tài)壓縮并寫入磁盤
  •  更多……

源碼(Git)

你可以在我的倉庫底下找到所有的例子并在自己的機(jī)器上測試。

narenaryan/node-backpressure-internals

結(jié)論

我寫這篇文章的動(dòng)機(jī),主要是為了說明即使 NodeJS 提供了很好的 API,我們也可能會(huì)一不留神就寫出性能很差的代碼。如果我們能更多地關(guān)注其內(nèi)置的工具,我們便可以更好地優(yōu)化程序的運(yùn)行方式。

你在此可以找到更多關(guān)于“背壓”的資料:

backpressuring-in-streams

完。 

 

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2013-05-17 09:41:02

Node.js云應(yīng)用開發(fā)IaaS

2022-09-12 16:02:32

Docker安全Node.js

2023-03-07 14:31:44

Node.jsPython應(yīng)用程序

2020-09-04 15:06:04

Docker容器化Node.js

2022-12-14 14:40:27

Node.js開發(fā)應(yīng)用程序

2022-05-09 17:33:23

PWA漸進(jìn)式Web應(yīng)用程序離線優(yōu)先

2024-03-22 11:40:40

Node.jsNodeCRUD

2012-09-17 11:26:14

IBMdw

2023-10-26 01:28:02

2023-03-24 15:57:31

Node.js應(yīng)用程序容器

2023-06-16 15:14:57

Node.js容器化開發(fā)

2014-07-11 14:16:15

AbsurdJSExpress

2025-08-11 07:58:55

2020-10-26 08:34:13

Node.jsCORS前端

2020-09-22 07:35:42

Node.jsVue.js文件壓縮

2015-11-20 17:09:36

jsWeb應(yīng)用程序

2024-03-27 11:18:02

2023-10-18 16:39:32

2017-03-20 13:43:51

Node.js內(nèi)存泄漏

2017-03-19 16:40:28

漏洞Node.js內(nèi)存泄漏
點(diǎn)贊
收藏

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

香港三级日本三级| 在线国产99| 无码人妻久久一区二区三区 | 日韩在线三级| 国产一区二区三区成人| 亚洲高清电影| 在线日韩第一页| 岛国av免费观看| 日本美女一区| 亚洲一区在线观看视频| 欧美一区二区在线| www.97av.com| 美女脱光内衣内裤视频久久网站 | 中文字幕日韩在线播放| 亚洲一级Av无码毛片久久精品| 欧美男体视频| 亚洲国产欧美一区二区三区丁香婷| 欧美不卡在线一区二区三区| 国产suv一区二区| 视频在线观看91| 久久久欧美精品| 黄色一级大片在线免费观看| 欧美日韩xxxx| 精品盗摄一区二区三区| 天天看片天天操| 中文字幕成在线观看| 一区二区三区四区不卡视频| 色一情一乱一伦一区二区三欧美| 人妻少妇精品无码专区| 国产传媒欧美日韩成人| 国产精品自在线| 一级黄色av片| 国产精品美女久久久| 欧美激情一级二级| 亚洲综合网在线| 午夜片欧美伦| 丝袜美腿亚洲一区二区| 成年人在线免费看片| 亚洲人成伊人成综合图片| 亚洲第一区中文99精品| 国产精品成人免费一区久久羞羞| 国产精品第一国产精品| 91福利国产成人精品照片| 国产日产欧美视频| 玖玖在线播放| 亚洲成av人片一区二区梦乃| 99久久久精品视频| 3d玉蒲团在线观看| 亚洲人成精品久久久久久| 亚洲综合av一区| 自拍视频在线免费观看| 中文字幕不卡的av| 日韩三级电影网站| 77导航福利在线| 国产精品日韩成人| 在线看成人av电影| 国产在线激情视频| 一区二区三区不卡视频在线观看 | 在线不卡免费欧美| 手机在线国产视频| 国产一区一区| 日韩精品一区二区三区四区| 制服丝袜av在线| 国产精品视屏| 国产偷国产偷亚洲清高网站| 成人片黄网站色大片免费毛片| 曰本一区二区三区视频| 中文字幕日韩精品在线观看| frxxee中国xxx麻豆hd| 91精品观看| 久久久久成人精品| 在线免费黄色av| 免费看欧美女人艹b| 亚洲在线免费视频| 人妻少妇精品无码专区| 国产清纯在线一区二区www| 色狠狠久久av五月综合| 黄色免费网站在线| 五月激情综合婷婷| 免费涩涩18网站入口| а天堂中文最新一区二区三区| 欧美一级高清大全免费观看| 少妇一级淫免费观看| 欧洲杯足球赛直播| 久久91超碰青草是什么| 永久免费看片在线播放| 日韩精品三区四区| 96精品久久久久中文字幕| 亚洲黄色片视频| 久久久久99精品国产片| 一区二区三区在线视频111 | 日韩av日韩在线观看| 中文字幕日本人妻久久久免费| 国产精品一区二区x88av| 久久久久久久久久久久久久一区| 尤物在线视频| 无码av中文一区二区三区桃花岛| 在线观看高清免费视频| 成人免费在线电影网| 中文亚洲视频在线| 日产欧产va高清| 麻豆国产精品一区二区三区| 精品视频导航| а√中文在线8| 色婷婷综合五月| av影片在线播放| 欧美一区二区三区激情视频| 欧美疯狂做受xxxx高潮| 成人黄色激情视频| 成人在线综合网| 一区二区三视频| 欧美自拍电影| 亚洲第一福利在线观看| 性欧美疯狂猛交69hd| 日韩制服丝袜先锋影音| 国产精品视频免费一区| 成人午夜在线影视| 欧美午夜免费电影| 搡老熟女老女人一区二区| 欧美在线亚洲| 国产日韩欧美电影在线观看| 能在线看的av| 精品人伦一区二区三区蜜桃网站| 亚洲欧美天堂在线| 大色综合视频网站在线播放| 97在线免费观看视频| 精品人妻一区二区三区含羞草| 国产调教视频一区| 成年人视频观看| 韩国精品福利一区二区三区| 不卡中文字幕av| 国产精品久久久久久在线| 国产偷国产偷亚洲高清人白洁| 日韩欧美不卡在线| 成人性生交大片免费看96| 欧美成人手机在线| 国产女无套免费视频| 国产精品初高中害羞小美女文| av五月天在线| 国产探花一区| 国产精品福利在线观看| 九色在线观看| 日本道精品一区二区三区| 一女三黑人理论片在线| 亚洲永久网站| 久久久久久九九| 久久野战av| 一区二区三区 在线观看视| 色av性av丰满av| 国产丝袜在线精品| 亚洲精品一二三四五区| 成人激情电影在线| 国产精品丝袜白浆摸在线 | 国产乱叫456| 夜间精品视频| 成人动漫在线视频| 成人爽a毛片免费啪啪动漫 | 色多多视频在线观看| 欧美日韩一区视频| 久久av红桃一区二区禁漫| 国内精品伊人久久久久影院对白| 最新视频 - x88av| 视频一区国产| 91精品国产成人www| 欧美孕妇孕交xxⅹ孕妇交| 色播五月激情综合网| 日本午夜精品视频| 国产高清精品久久久久| www在线观看免费| 九九综合久久| 成人美女免费网站视频| 欧美黑人xx片| 亚洲欧美一区二区三区久久 | 精品日产卡一卡二卡麻豆| 国产亚洲精久久久久久无码77777| 丁香六月综合激情| 中文字幕无码不卡免费视频| 97精品中文字幕| 成人h在线播放| 国产精品极品美女在线观看| 久久久999精品| 天天操天天干天天干| 在线观看日韩高清av| 欧美黑人性猛交xxx| 99久久久久久| 极品粉嫩美女露脸啪啪| 樱桃成人精品视频在线播放| 日本不卡久久| 999精品视频在这里| 国产精品成人国产乱一区| v天堂福利视频在线观看| 亚洲欧美国产日韩中文字幕| 91丨九色丨丰满| 黄网动漫久久久| 国产精品白丝喷水在线观看| 99久久精品国产毛片| 国产无色aaa| 亚洲男女自偷自拍| 欧洲金发美女大战黑人| 国产一区二区三区网| 国产伦精品一区二区三毛| 国产一区二区精品调教| 国a精品视频大全| 国产区在线观看| 国产亚洲成av人片在线观看桃| 亚洲国产精品一| 欧美高清你懂得| 中文字幕xxxx| 午夜精品久久久久久久久久 | 一区二区三区四区在线观看国产日韩| 精品一区二区国产| 亚洲第一二区| 国产乱人伦真实精品视频| 日韩在线伦理| 欧美激情一二区| 伊人手机在线| 久久夜精品va视频免费观看| 成人在线免费视频| 日韩激情第一页| 国模无码一区二区三区| 欧美一区中文字幕| 91theporn国产在线观看| 色婷婷久久久综合中文字幕| 三级黄色在线视频| 亚洲成人一区在线| 欧洲猛交xxxx乱大交3| 国产精品久久久久四虎| 无码少妇一区二区| 国产亚洲福利社区一区| 亚洲综合自拍网| 成人激情免费电影网址| 又大又长粗又爽又黄少妇视频| 激情文学综合丁香| 97超碰人人爽| 黄色小说综合网站| 亚洲综合日韩欧美| 麻豆精品一区二区三区| 男人的天堂日韩| 日韩高清不卡在线| 日韩av手机版| 麻豆国产一区二区| 亚洲人视频在线| 久久99久久99| 成年人网站av| 丁香啪啪综合成人亚洲小说| 国产精品偷伦视频免费观看了| 国产伦精品一区二区三区免费| 久久6免费视频| 国产精品综合一区二区三区| 亚洲综合在线一区二区| 国产精品影视天天线| 日韩大尺度视频| 成人动漫一区二区| 亚洲观看黄色网| 久久久精品欧美丰满| 国产传媒在线看| 中文字幕日本乱码精品影院| av最新在线观看| 亚洲精品视频一区二区| 国产午夜小视频| 精品久久久香蕉免费精品视频| 久久一区二区三区视频| 91久久精品一区二区三区| 中文字幕免费观看视频| 91麻豆精品91久久久久同性| 蜜桃视频污在线观看| 亚洲国产精品字幕| 超碰在线国产| 欧美肥婆姓交大片| a一区二区三区| 91精品国产综合久久香蕉922| 日韩精品中文字幕吗一区二区| 国产精品久久久一区二区三区| 日本在线中文字幕一区| 亚洲欧美日韩国产yyy| 66视频精品| 免费无码不卡视频在线观看| 日本欧美韩国一区三区| 深夜做爰性大片蜜桃| 97精品国产露脸对白| 婷婷国产成人精品视频| 亚洲一区二区三区四区在线观看 | 欧美精品自拍偷拍| 丰满肉嫩西川结衣av| 亚洲天堂男人天堂| 在线欧美三级| 日韩av电影在线网| 欧美一区一区| 欧美日韩一区二区视频在线 | 欧美黑白配在线| 亚洲永久一区二区三区在线| 亚洲欧洲日本mm| 激情黄色小视频| 久久嫩草精品久久久精品| 黄视频网站免费看| 色8久久人人97超碰香蕉987| 精品人妻一区二区三区日产乱码| 亚洲视频axxx| 成人影音在线| 91免费在线视频| 国产99精品一区| 高清无码视频直接看| 美女视频一区二区三区| 国产精品1000部啪视频| 一区二区成人在线视频| 国产精品51麻豆cm传媒| 日韩av在线资源| 怡红院红怡院欧美aⅴ怡春院| 国产精品青草久久久久福利99| 风间由美中文字幕在线看视频国产欧美 | 高潮久久久久久久久久久久久久| 亚洲午夜在线观看| 亚洲综合国产激情另类一区| 久久久久中文字幕亚洲精品| 中文字幕日韩欧美一区二区三区| 精品成人无码久久久久久| 亚洲第一二三四五区| 男女视频在线| 91视频免费进入| 999久久久精品国产| 午夜欧美福利视频| 久久综合久久久久88| 国产真人真事毛片| 日韩欧美一区二区免费| 美女免费久久| 国产精品中文久久久久久久| 欧美人妖在线| 日本三区在线观看| 久久久久久久久一| 欧美三级午夜理伦| 亚洲国产精品va| 牛牛精品在线| 国产精品xxxx| 亚洲小说区图片区| 曰本三级日本三级日本三级| 亚洲欧美一区二区三区极速播放| 中文字幕一区2区3区| 在线精品播放av| 懂色aⅴ精品一区二区三区| 亚洲成色www久久网站| 日本不卡免费在线视频| 日韩不卡av在线| 欧美中文字幕亚洲一区二区va在线| 日本护士...精品国| 91成品人片a无限观看| 一区二区导航| 亚洲欧美另类动漫| 国产精品久久777777| 国产精品视频久久久久久| 中文字幕欧美国内| 综合欧美精品| 天天想你在线观看完整版电影免费| 国产盗摄一区二区三区| 久久久久久久9999| 亚洲成人激情图| 中文字幕色婷婷在线视频| 欧美二区三区在线| 天堂久久一区二区三区| 在线观看免费黄色网址| 777久久久精品| 欧美xxxx性xxxxx高清| 国产精品久久久久免费| 久久性天堂网| 肉色超薄丝袜脚交69xx图片| 欧美一区二区久久| 电影在线观看一区| 日产中文字幕在线精品一区| 久久电影国产免费久久电影 | 日韩欧美国产骚| yes4444视频在线观看| 亚洲综合av影视| 国产亚洲一区在线| 欧美a在线播放| 亚洲а∨天堂久久精品9966| 午夜av不卡| 日本福利视频导航| 97se狠狠狠综合亚洲狠狠| 九九热最新视频| 欧美日韩国产成人在线| 免费看av成人| 99久久综合网| 91福利国产成人精品照片| 在线看女人毛片| 欧洲一区二区在线| 国产九九视频一区二区三区| 日韩在线视频免费播放| 日韩中文字幕免费| 精品久久ai| www.欧美激情.com| 日韩欧美中文字幕在线观看| 欧美一级二级三级区| 国产日韩欧美精品| 久99久精品视频免费观看| 伊人久久综合视频| 久久人人爽亚洲精品天堂| 一个色免费成人影院| 国产麻豆剧传媒精品国产| 在线看不卡av| 多野结衣av一区| 国产又粗又大又爽的视频|