免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

JS數(shù)組去重百萬(wàn)級(jí)數(shù)據(jù)性能實(shí)測(cè):Set為何碾壓filter+indexOf

JS數(shù)組去重百萬(wàn)級(jí)數(shù)據(jù)性能實(shí)測(cè):Set為何碾壓filter+indexOf 處理 JS 數(shù)組去重幾乎是每個(gè)前端和 Node 開發(fā)都繞不開的事。平時(shí)數(shù)據(jù)量小怎么寫都不卡可一旦數(shù)據(jù)量拉到百萬(wàn)級(jí)不同去重方式之間的差距會(huì)從“都能用”變成“一個(gè)幾十毫秒、一個(gè)卡死頁(yè)面”。我之前在優(yōu)化一個(gè)數(shù)據(jù)清洗腳本時(shí)就因?yàn)轫樖钟昧薴ilter indexOf去重 100 萬(wàn)行數(shù)據(jù)跑了將近十分鐘一度以為程序死循環(huán)了。后來(lái)?yè)Q成 Set幾十毫秒出結(jié)果。這個(gè)反差讓我徹底明白js 去重方式不是隨手挑一個(gè)就行在百萬(wàn)級(jí)數(shù)據(jù)量級(jí)下選錯(cuò)方式是真的會(huì)出事。這篇內(nèi)容主要講兩件事一是各種主流 js 去重方式的底層原理和時(shí)間復(fù)雜度二是我在百萬(wàn)級(jí)數(shù)據(jù)下實(shí)際跑出來(lái)的結(jié)果以及不同場(chǎng)景下到底該怎么選。無(wú)論你是剛接觸前端不久還是在搞埋點(diǎn)日志、數(shù)據(jù)清洗這份對(duì)比和踩坑記錄都值得收藏。1. 去重方式的底層差異為什么 Set 能把百萬(wàn)級(jí)數(shù)據(jù)按在地上摩擦1.1 先說(shuō)結(jié)論查重思路決定時(shí)間復(fù)雜度常見的去重方式有 Set、Map、filter indexOf、對(duì)象鍵值法、排序去重、雙重循環(huán)。表面上看都是“把重復(fù)元素干掉”但它們判斷重復(fù)的方式完全不同性能差距也由此而來(lái)。Set 和 Map 底層都是哈希表結(jié)構(gòu)。插入一個(gè)元素時(shí)能平均在 O(1) 時(shí)間內(nèi)完成“這個(gè)值我之前有沒有見過(guò)”的判斷。循環(huán) n 個(gè)元素總時(shí)間復(fù)雜度就是 O(n)。filter indexOf 則完全不同每次 indexOf 都要從數(shù)組頭開始掃描判斷一個(gè)元素需要遍歷一遍已有數(shù)組內(nèi)層循環(huán)套外層循環(huán)整體就是 O(n2)。百萬(wàn)級(jí)數(shù)據(jù)下n 1,000,000O(n2) 意味著大約 10^12 次操作而 O(n) 只有一百萬(wàn)次理論差距就是百萬(wàn)倍。即便哈希表有常數(shù)開銷這個(gè)數(shù)量級(jí)差距也已經(jīng)決定勝負(fù)了。1.2 百萬(wàn)級(jí)數(shù)據(jù)量到底放大了什么100 萬(wàn)條數(shù)據(jù)對(duì)瀏覽器來(lái)說(shuō)已經(jīng)不是小數(shù)目。一個(gè)純數(shù)字的數(shù)組按 Number 類型每個(gè) 8 字節(jié)算大約占用 8MB 左右如果存的是字符串或者對(duì)象內(nèi)存占用會(huì)成倍上漲。這個(gè)時(shí)候如果去重方法還要?jiǎng)?chuàng)建大量中間數(shù)組、反復(fù)深拷貝或者出現(xiàn)嵌套循環(huán)內(nèi)存和 GC 壓力會(huì)跟著爆炸不是光慢那么簡(jiǎn)單有可能直接把標(biāo)簽頁(yè)搞崩。我用一個(gè)生活化類比indexOf 去重就像是新來(lái)一個(gè)人要挨個(gè)問(wèn)前面所有人“你們見過(guò)這個(gè)人嗎”每來(lái)一個(gè)都問(wèn)一遍人越多詢問(wèn)次數(shù)膨脹得越離譜。而 Set 是給每個(gè)值一個(gè)獨(dú)立柜子看到新名字先打開對(duì)應(yīng)柜子看看有沒有人有就跳過(guò)沒有就登記。柜子查找是常數(shù)時(shí)間即便 100 萬(wàn)人也只需要 100 萬(wàn)次開柜子。差距就是這么來(lái)的。1.3 核心衡量指標(biāo)時(shí)間復(fù)雜度、內(nèi)存、可讀性選去重方式不能只看速度還要兼顧內(nèi)存和可讀性。時(shí)間復(fù)雜度在百萬(wàn)級(jí)數(shù)據(jù)下基本決定一切Set、Map 這類哈希方案統(tǒng)治級(jí)領(lǐng)先。內(nèi)存方面Set/Map 本身要有額外哈希表開銷但相比 O(n2) 方案不斷創(chuàng)建臨時(shí)數(shù)組和頻繁調(diào)用棧通常還是更劃算??勺x性上Set 一行代碼最直觀Map 做對(duì)象數(shù)組按字段去重時(shí)邏輯也很清晰。我一般按這個(gè)順序權(quán)衡先看會(huì)不會(huì)修改原數(shù)組再看時(shí)間復(fù)雜度和內(nèi)存最后考慮代碼給別人看的時(shí)候要不要解釋半天。百萬(wàn)級(jí)數(shù)據(jù)場(chǎng)景下時(shí)間和內(nèi)存優(yōu)先級(jí)最高代碼稍微繞一點(diǎn)加注釋就行但性能不行就真的不行。2. 百萬(wàn)級(jí)數(shù)據(jù)實(shí)測(cè)搭一個(gè)能復(fù)現(xiàn)的基準(zhǔn)測(cè)試2.1 測(cè)試環(huán)境與數(shù)據(jù)準(zhǔn)備先說(shuō)測(cè)試環(huán)境Node.js 18.16.0M1 MacBook Pro16G 內(nèi)存。瀏覽器端結(jié)論類似但不同 JS 引擎對(duì) Set 的優(yōu)化有差異數(shù)字不會(huì)完全一致。想復(fù)現(xiàn)的話把代碼粘到 Node 環(huán)境直接跑就行。數(shù)據(jù)準(zhǔn)備很關(guān)鍵。不能用固定順序的數(shù)組如果數(shù)據(jù)恰好有序排序去重會(huì)占大便宜。為了模擬真實(shí)混排數(shù)據(jù)我用隨機(jī)數(shù)生成 100 萬(wàn)條數(shù)組取值范圍 0 到 499999這樣重復(fù)率不會(huì)太低也不會(huì)全部重復(fù)。生成代碼很簡(jiǎn)單const arr Array.from({ length: 1000000 }, () Math.floor(Math.random() * 500000));這行代碼會(huì)在內(nèi)存里生成約 100 萬(wàn)個(gè)隨機(jī)數(shù)。取值范圍 50 萬(wàn)理論上隨機(jī)生成 100 萬(wàn)個(gè)位置去重后大約 43 萬(wàn)左右重復(fù)率約 57%。真實(shí)業(yè)務(wù)里的臟數(shù)據(jù)通常就是這個(gè)量級(jí)有重復(fù)但不至于全是重復(fù)。2.2 測(cè)試代碼與運(yùn)行方式因?yàn)?Set 這類方案耗時(shí)可能只有幾十毫秒而 filter indexOf 直接跑 100 萬(wàn)可能等到天荒地老所以我把所有方案放在同一份腳本里用 performance.now 計(jì)時(shí)多跑幾次取中位數(shù)避免單次抖動(dòng)。每個(gè)方案都傳入同一個(gè) arr但方法內(nèi)部自己拷貝需要處理的數(shù)據(jù)避免前面方法改了原數(shù)組影響后面的結(jié)果。const { performance } require(perf_hooks); function test(name, fn, data) { const start performance.now(); const result fn(data); const end performance.now(); console.log(name, (end - start).toFixed(2) ms, 去重后長(zhǎng)度:, result.length); } // filterindexOf 在 100 萬(wàn)數(shù)據(jù)下太慢單獨(dú)準(zhǔn)備一個(gè) 5 萬(wàn)子集 const smallArr arr.slice(0, 50000); test(Set去重, (data) [...new Set(data)], arr); test(Map去重, (data) [...new Map(data.map((item) [item, item])).keys()], arr); test(對(duì)象鍵值去重, (data) { const obj {}; return data.filter((item) { if (obj[item]) return false; obj[item] true; return true; }); }, arr); test(排序相鄰去重, (data) { const sorted [...data].sort((a, b) a - b); return sorted.filter((item, i) i 0 || item ! sorted[i - 1]); }, arr); test(filterindexOf, (data) data.filter((item, index) data.indexOf(item) index), smallArr);我在測(cè)試時(shí)特意把 filter indexOf 單獨(dú)放到 5 萬(wàn)條數(shù)據(jù)上不直接跑 100 萬(wàn)因?yàn)?100 萬(wàn)條下它可能要等好幾分鐘腳本看起來(lái)就像卡死了。這也是踩坑之后學(xué)到的教訓(xùn)基準(zhǔn)測(cè)試也要先評(píng)估被測(cè)試方法能不能扛住測(cè)試規(guī)模不能拍腦袋直接全部跑 100 萬(wàn)。2.3 從數(shù)據(jù)上理解為什么差了幾個(gè)數(shù)量級(jí)我這邊跑出來(lái)的結(jié)果大致如下具體數(shù)字和運(yùn)行環(huán)境有關(guān)但數(shù)量級(jí)差距不會(huì)變?nèi)ブ胤绞綌?shù)據(jù)量耗時(shí)去重結(jié)果長(zhǎng)度Set100 萬(wàn)約 25~35ms約 43 萬(wàn)Map100 萬(wàn)約 35~45ms約 43 萬(wàn)對(duì)象鍵值100 萬(wàn)約 50~70ms約 43 萬(wàn)排序相鄰100 萬(wàn)約 120~180ms約 43 萬(wàn)filterindexOf5 萬(wàn)約 1500~2000ms約 4.8 萬(wàn)注意表格里的 filter indexOf 只跑了 5 萬(wàn)條數(shù)據(jù)。它的復(fù)雜度是 O(n2)數(shù)據(jù)量從 5 萬(wàn)漲到 100 萬(wàn)變成了 20 倍耗時(shí)理論上要變成 400 倍。按 1.5 秒估算到 100 萬(wàn)就是 600 秒約 10 分鐘。這個(gè)數(shù)量級(jí)基本是災(zāi)難不是優(yōu)化能救回來(lái)的。3. 五種主流去重方式逐個(gè)拆解與結(jié)果對(duì)比3.1 Set 去重一行代碼為什么最快Set 去重是現(xiàn)在最常用的寫法核心就是利用 Set 存唯一值的特性const unique [...new Set(arr)]; // 或者 Array.from(new Set(arr))Set 底層使用哈希表插入時(shí)計(jì)算哈希值定位到桶沖突概率小的話平均 O(1) 完成插入。整個(gè)過(guò)程只需要一次循環(huán)不需要額外的 indexOf 掃描內(nèi)存多出一份 Set 結(jié)構(gòu)的大小。字符串、數(shù)字、布爾值這些原始類型都可以直接存NaN 也能正確去重這是它相比 indexOf 方案的一個(gè)隱藏優(yōu)勢(shì)。我實(shí)際測(cè)下來(lái)100 萬(wàn)數(shù)據(jù) Set 去重基本都在幾十毫秒內(nèi)代碼只有一行幾乎沒有比它更好的性價(jià)比。唯一的硬傷是對(duì)引用類型Set 比較的是引用地址而不是結(jié)構(gòu)。兩個(gè)內(nèi)容完全一樣的對(duì)象只要不是同一個(gè)引用Set 就不會(huì)去重。這個(gè)后面講對(duì)象數(shù)組去重時(shí)會(huì)單獨(dú)說(shuō)。3.2 filter indexOf典型 O(n2) 反面教材代碼非常好讀const unique arr.filter((item, index) arr.indexOf(item) index);意思就是只有當(dāng)某個(gè)元素在數(shù)組里第一次出現(xiàn)的位置就是當(dāng)前位置時(shí)才保留它。問(wèn)題在于indexOf 每次都要從數(shù)組頭部開始遍歷查找filter 本身也要整體遍歷一遍很多元素會(huì)被反復(fù)掃描。數(shù)據(jù)量小的時(shí)候沒感覺到百萬(wàn)級(jí)就是災(zāi)難。我這邊測(cè) 5 萬(wàn)條數(shù)據(jù)已經(jīng)要 1.5 秒以上如果強(qiáng)行跑 100 萬(wàn)10 分鐘是保守估計(jì)。這還沒算 filter 會(huì)創(chuàng)建新數(shù)組indexOf 在查找時(shí)不斷訪問(wèn)原數(shù)組帶來(lái)大量?jī)?nèi)存和 CPU 緩存開銷。真實(shí)瀏覽器環(huán)境里這段代碼會(huì)讓頁(yè)面長(zhǎng)時(shí)間無(wú)響應(yīng)體驗(yàn)極差。如果業(yè)務(wù)上真的繞不開這個(gè)寫法最多也就處理幾百到幾千條數(shù)據(jù)。超過(guò)這個(gè)量級(jí)老老實(shí)實(shí)用 Set 或 Map。不要覺得 filter indexOf 簡(jiǎn)潔就無(wú)腦用簡(jiǎn)潔在這一場(chǎng)景里是陷阱。3.3 對(duì)象/Map 鍵值法和 Set 很像但陷阱不少對(duì)象鍵值法的常見寫法有兩種一種是對(duì)象當(dāng)哈希表一種是 Map。先說(shuō)對(duì)象const obj {}; const unique arr.filter((item) { if (obj[item]) return false; obj[item] true; return true; });這個(gè)方案看起來(lái)也是 O(n)但有幾個(gè)坑。第一對(duì)象的鍵名只能是字符串或 Symbol數(shù)字會(huì)被轉(zhuǎn)成字符串于是 1 和 1 會(huì)被當(dāng)成同一個(gè)鍵。第二如果數(shù)據(jù)里有 proto、constructor 這類特殊字符串直接 obj[item] 可能造成原型鏈污染甚至誤判。第三對(duì)象普通屬性的讀寫比 Map 要慢一些。所以我用對(duì)象做百萬(wàn)級(jí)測(cè)試時(shí)耗時(shí)通常是 Set 的兩倍左右。用 Map 會(huì)更穩(wěn)const map new Map(); arr.forEach((item) { if (!map.has(item)) map.set(item, true); }); const unique [...map.keys()];Map 的鍵可以是任意類型讀寫性能和 Set 接近而且不會(huì)把數(shù)字強(qiáng)轉(zhuǎn)字符串。如果只做去重Set 其實(shí)更合適如果后續(xù)還要保留每個(gè)鍵對(duì)應(yīng)的某個(gè)值那 Map 是首選。百萬(wàn)級(jí)數(shù)據(jù)下 Map 去重通常比 Set 慢 10~20ms差距不大可以接受。3.4 排序 相鄰比較時(shí)間不差但要注意副作用思路是先排序再遍歷一次只保留和上一個(gè)元素不同的值const sorted [...arr].sort((a, b) a - b); const unique sorted.filter((item, i) i 0 || item ! sorted[i - 1]);排序時(shí)間復(fù)雜度 O(n log n)比 O(n) 差一點(diǎn)但比 O(n2) 好很多。實(shí)測(cè) 100 萬(wàn)數(shù)據(jù)大概 120~180ms某些場(chǎng)景下依然可用。但有兩個(gè)坑一是 sort 會(huì)改變?cè)仨樞蛉绻阆MA舻谝淮纬霈F(xiàn)的順序排序去重直接不滿足二是比較函數(shù)如果寫不好對(duì)有 NaN 的數(shù)組會(huì)得到很奇怪的結(jié)果。代碼里我用的是數(shù)字比較函數(shù)如果數(shù)組里有字符串需要換成 localeCompare 之類的比較器。還有sort 方法會(huì)修改原數(shù)組所以我先做了淺拷貝 [...arr]這也會(huì)增加一份內(nèi)存。如果原數(shù)組順序無(wú)所謂排序去重是個(gè)折中方案但能 Set 還是首選 Set因?yàn)?Set 代碼更短、更快。3.5 雙重循環(huán) / 標(biāo)記法只適合小數(shù)組或特殊去重有些人不用 Set是因?yàn)闃I(yè)務(wù)場(chǎng)景要求按對(duì)象的某個(gè)字段去重或者要保持原順序。這時(shí)候可能會(huì)寫雙重循環(huán)const unique []; for (let i 0; i arr.length; i) { let isDuplicate false; for (let j 0; j unique.length; j) { if (unique[j] arr[i]) { isDuplicate true; break; } } if (!isDuplicate) unique.push(arr[i]); }這本質(zhì)上也是 O(n2)而且比 filter indexOf 還多一個(gè)數(shù)組 push百萬(wàn)級(jí)數(shù)據(jù)下絕對(duì)不能碰。它唯一的優(yōu)勢(shì)是可以在比較時(shí)寫復(fù)雜邏輯比如比較對(duì)象多個(gè)字段。但更好的做法是用 Map 把查找重復(fù)的復(fù)雜度降到 O(1)循環(huán)本身保持 O(n)。對(duì)于 Canvas 里面實(shí)時(shí)處理上萬(wàn)個(gè)點(diǎn)雙重循環(huán)勉強(qiáng)能用但超過(guò) 10 萬(wàn)就要考慮換方案了。4. 不同業(yè)務(wù)場(chǎng)景下的最佳去重方案4.1 純?cè)贾禂?shù)組無(wú)腦用 Set如果數(shù)組元素是數(shù)字、字符串、布爾值這類原始值不需要額外保留每個(gè)值對(duì)應(yīng)的其他信息Set 就是最優(yōu)解。代碼最簡(jiǎn)單速度最快也不容易出錯(cuò)。唯一要確認(rèn)的是兼容性IE 不支持 Set但現(xiàn)在還在做 IE 適配的場(chǎng)景已經(jīng)不多了就算要兼容也應(yīng)該用 polyfill而不是換成一個(gè) O(n2) 的方案。我之前在優(yōu)化一個(gè)百萬(wàn)級(jí) ID 數(shù)組時(shí)試過(guò)用 reduce 手動(dòng)去重代碼寫了一大段性能還是不如 Set。后面想通了簡(jiǎn)單場(chǎng)景不要炫技直接const uniqueIds [...new Set(ids)];干凈、快、不容易出 bug。4.2 對(duì)象數(shù)組按字段去重用 Map 做 key 映射對(duì)象數(shù)組去重是另一個(gè)高頻場(chǎng)景比如日志列表按 userId 去重商品列表按 sku 去重。如果直接用 Set兩個(gè)字段相同但引用不同的對(duì)象會(huì)被當(dāng)成不同元素去不掉。正確做法是用 Map把要去重的字段拼成 keyconst list [ { id: 1, name: a }, { id: 2, name: b }, { id: 1, name: c }, ]; const map new Map(); for (const item of list) { const key item.id; if (!map.has(key)) map.set(key, item); } const unique [...map.values()];如果去重字段不止一個(gè)可以把多個(gè)字段拼成一個(gè)字符串作 key但要注意分隔符的選擇。比如key ${item.type}-${item.id} 時(shí)如果 type 或 id 本身可能包含 -就會(huì)撞 key。更穩(wěn)妥的辦法是用嵌套 MapouterMap.get(type).set(id, item)或者手動(dòng)構(gòu)造一個(gè)穩(wěn)定的字符串 key。JSON.stringify 一個(gè)只含目標(biāo)字段的小對(duì)象也是一種辦法但要注意字段聲明順序不同會(huì)產(chǎn)生不同 key。這個(gè)坑我在實(shí)際項(xiàng)目中踩過(guò)兩個(gè)重復(fù)項(xiàng)沒被去掉統(tǒng)計(jì)數(shù)據(jù)差了一大截。4.3 超大數(shù)組內(nèi)存敏感分片處理或原地標(biāo)記如果數(shù)據(jù)量不只百萬(wàn)而是上千萬(wàn)或者運(yùn)行環(huán)境是內(nèi)存緊張的設(shè)備Set/Map 的內(nèi)存開銷也要考慮。Set 對(duì)每個(gè)元素都要維護(hù)哈希表項(xiàng)內(nèi)存可能比原數(shù)組大好幾倍。這時(shí)候可以分片處理比如每次處理 20 萬(wàn)條去重后合并用全局 Set 存放已見值function dedupeInChunks(arr, chunkSize 200000) { const seen new Set(); const result []; for (let i 0; i arr.length; i chunkSize) { const chunk arr.slice(i, i chunkSize); for (const item of chunk) { if (!seen.has(item)) { seen.add(item); result.push(item); } } } return result; }這種寫法的時(shí)間復(fù)雜度仍是 O(n)內(nèi)存不會(huì)一次性塞入全部 Set適合數(shù)據(jù)量特別大的場(chǎng)景。代價(jià)是代碼變長(zhǎng)。如果內(nèi)存非常緊張可以不 slice直接通過(guò)索引在原數(shù)組上遍歷。4.4 需要保持順序不同方案順序表現(xiàn)保留順序的需求經(jīng)常被忽略。Set、Map、filter indexOf 天然保留第一次出現(xiàn)的順序。對(duì)象鍵值法如果只用 filter 也是保留順序的但特殊鍵名有風(fēng)險(xiǎn)。排序去重會(huì)改變順序不適合需要按原順序輸出的場(chǎng)景。如果在去重的同時(shí)還需要把每類數(shù)據(jù)的最后一條記錄取出來(lái)Map 也可以實(shí)現(xiàn)更復(fù)雜的操作通過(guò)每次都更新 value 就行。這是 Set 做不到的需要按場(chǎng)景選型。4.5 性能速查表方案時(shí)間復(fù)雜度內(nèi)存占用是否保序百萬(wàn)級(jí)實(shí)測(cè)參考適用場(chǎng)景SetO(n)中是25~35ms原始值數(shù)組首選MapO(n)中是35~45ms對(duì)象按字段去重/需要鍵值映射對(duì)象鍵值O(n)低是50~70ms簡(jiǎn)單場(chǎng)景注意鍵名陷阱排序相鄰O(n log n)高排序拷貝否120~180ms不要求順序數(shù)據(jù)非海量filterindexOfO(n2)中是5萬(wàn)約1.5s只適合幾百到幾千的小數(shù)組表格里的耗時(shí)是我個(gè)人環(huán)境的結(jié)果不代表所有瀏覽器但時(shí)間復(fù)雜度是確定的。你在自己機(jī)器上跑一遍就能驗(yàn)證這個(gè)數(shù)量級(jí)。5. 實(shí)戰(zhàn)案例百萬(wàn)級(jí)日志按用戶去重的完整方案5.1 需求描述與踩坑案例一個(gè)真實(shí)場(chǎng)景某天我需要處理 100 萬(wàn)條登錄日志每條 log 是一個(gè)對(duì)象包含 uid、time、device 等字段。業(yè)務(wù)要求按 uid 去重并且保留每個(gè) uid 最新的一條日志。數(shù)據(jù)量百萬(wàn)級(jí)如果寫雙重循環(huán)或者 filter indexOf頁(yè)面或者 Node 腳本基本就廢了。一開始同事用 sort 按時(shí)間倒序排然后 filter 相鄰 uid 去重logs.sort((a, b) Date.parse(b.time) - Date.parse(a.time)); const result logs.filter((item, i) i 0 || item.uid ! logs[i - 1].uid);這個(gè)方案在 100 萬(wàn)條數(shù)據(jù)下大約跑了 1 秒多看起來(lái)還行但它改變了原數(shù)組順序而且如果 uid 是數(shù)字和字符串混合判斷item.uid ! logs[i - 1].uid就會(huì)把123和123當(dāng)成不同用戶。我們線上就因?yàn)檫@個(gè)踩了坑。5.2 高效實(shí)現(xiàn)與關(guān)鍵代碼最穩(wěn)的方案是直接一遍 Map邊遍歷邊比較時(shí)間保留最新記錄。時(shí)間復(fù)雜度 O(n)也不會(huì)被 uid 類型混合影響const map new Map(); for (const log of logs) { const uid String(log.uid); // 統(tǒng)一字符串 key避免 123 和 123 分離 const old map.get(uid); if (!old || Date.parse(log.time) Date.parse(old.time)) { map.set(uid, log); } } const result [...map.values()];如果不想每次比較都重新 Date.parse可以先預(yù)處理一個(gè)小結(jié)構(gòu)把日志時(shí)間轉(zhuǎn)成時(shí)間戳再進(jìn) Mapconst map new Map(); for (let i 0; i logs.length; i) { const log logs[i]; const uid String(log.uid); const timestamp Date.parse(log.time); const old map.get(uid); if (!old || timestamp old._ts) { map.set(uid, { ...log, _ts: timestamp }); } } const result [...map.values()].map(({ _ts, ...rest }) rest);第二種做法把 Date.parse 的調(diào)用次數(shù)減少到每個(gè)用戶至多兩次時(shí)間比較也變成純數(shù)字比較百萬(wàn)級(jí)數(shù)據(jù)實(shí)測(cè)大約 200~300ms 出結(jié)果。相比排序去重的 1 秒多又快了不少而且完整保留了原始對(duì)象只是中間多了一個(gè)臨時(shí)字段。5.3 結(jié)果和擴(kuò)展建議按這個(gè)方案跑下來(lái)100 萬(wàn)條日志去重后長(zhǎng)度大概在 30 萬(wàn)左右耗時(shí)穩(wěn)定在 300ms 以內(nèi)。如果數(shù)據(jù)量繼續(xù)漲到 500 萬(wàn)、1000 萬(wàn)我建議直接分片每 20 萬(wàn)條一批處理配合全局 Map避免單次內(nèi)存占用過(guò)高。再大一點(diǎn)可以把任務(wù)丟到 Web Worker 里跑瀏覽器主線程完全不卡。這個(gè)案例還說(shuō)明了一個(gè)道理去重的核心不一定是“快速去掉重復(fù)項(xiàng)”而是“在去重的同時(shí)拿到你真正需要的那條數(shù)據(jù)”。用 Map 可以邊去重邊保留最新的、最早的、或者聚合后的值比單純 Set 更靈活。6. 避坑指南與我的實(shí)操建議6.1 你以為去重很純粹NaN、-0、引用類型這些邊角料Set 對(duì) NaN 的處理比 indexOf 強(qiáng)。indexOf 內(nèi)部走的是嚴(yán)格相等NaN NaN 為 false所以用 indexOf 去重時(shí)多個(gè) NaN 不會(huì)被去掉。Set 內(nèi)部用的是 SameValueZero 算法NaN 算同一個(gè)值能正常去重。另外-0 和 0 在 Set 里也被認(rèn)為是同一個(gè)值不會(huì)產(chǎn)生兩個(gè)元素。對(duì)于引用類型Set 比較的是引用地址。如果兩個(gè)對(duì)象結(jié)構(gòu)完全一樣但屬于不同引用Set 不會(huì)去重。所以不要試圖用 Set 直接去重對(duì)象數(shù)組除非你明確知道對(duì)象都是同一個(gè)引用。還有一個(gè)容易忽略的用 JSON.stringify 配合 Set 做對(duì)象去重時(shí)如果對(duì)象里有函數(shù)、undefined、Symbol這些會(huì)被 JSON.stringify 忽略或轉(zhuǎn)成 null可能導(dǎo)致錯(cuò)誤去重。比如兩個(gè)對(duì)象一個(gè)多了 undefined 字段序列化后居然一樣。這個(gè)坑我踩過(guò)最后改成手動(dòng)拼接關(guān)鍵字段才解決。6.2 測(cè)試時(shí)最容易犯的錯(cuò)編譯器優(yōu)化、隨機(jī)數(shù)干擾做性能對(duì)比時(shí)很多人直接 console.time 包一下就下結(jié)論結(jié)果被誤導(dǎo)。第一必須保證各方法操作的是同一份數(shù)據(jù)源或等價(jià)數(shù)據(jù)不能一個(gè)方法改了原數(shù)組后面方法跟著受影響。第二如果方法內(nèi)部創(chuàng)建了新數(shù)組測(cè)試時(shí)要把新數(shù)組消費(fèi)掉否則引擎覺得結(jié)果沒被使用可能會(huì)做死代碼消除導(dǎo)致結(jié)果虛低。第三隨機(jī)數(shù)組每次內(nèi)容不同重復(fù)率不同會(huì)影響排序去重這類方案的耗時(shí)所以要固定數(shù)據(jù)源或多次取平均。我調(diào)試時(shí)的做法是先固定生成一份數(shù)組存在變量里每個(gè)方法傳入同一個(gè) arr方法內(nèi)部自己拷貝需要的部分保證互不干擾。運(yùn)行多次取中位數(shù)比單次結(jié)果更可信。另一個(gè)容易被忽略的是 JIT 編譯預(yù)熱。第一次調(diào)用某個(gè)函數(shù)時(shí)JS 引擎可能要優(yōu)化編譯所以測(cè)試時(shí)先跑一遍熱身再用第二遍的結(jié)果作為參考。如果只跑一遍可能會(huì)把預(yù)熱時(shí)間也算進(jìn)去得到不真實(shí)的數(shù)字。6.3 我用了這么久的一點(diǎn)心得文章寫到這里我把個(gè)人沉淀的幾個(gè)習(xí)慣分享出來(lái)。第一在大數(shù)據(jù)量場(chǎng)景里不要聰明過(guò)頭先無(wú)腦用 Set 把功能跑通再用性能分析工具看瓶頸。很多同事一上來(lái)就寫個(gè)看起來(lái)很高效的排序去重結(jié)果數(shù)據(jù)不是數(shù)值類型排序還得寫復(fù)雜比較器反而比 Set 更慢。第二去重需求往往伴隨著統(tǒng)計(jì)需求比如去重后還要計(jì)算每個(gè)分類的數(shù)量、保留最近一條記錄等這時(shí)候直接用 Map 而不是 Set省得后面再造一遍輪子。第三如果數(shù)據(jù)量已經(jīng)大到 Set 也撐不住除了分片還可以考慮在數(shù)據(jù)源頭做約束比如后端 SQL 里加 DISTINCT或者日志采集時(shí)先用更節(jié)省空間的概率結(jié)構(gòu)把明顯重復(fù)的丟掉。前端 JS 能做的優(yōu)化有上限不能把壓力全扛在瀏覽器里。我用分片處理后再配合 Web Worker 把任務(wù)丟到后臺(tái)線程跑頁(yè)面完全不會(huì)卡體驗(yàn)好了很多。最后分享一個(gè)小技巧當(dāng)數(shù)組是百萬(wàn)級(jí)且全是不重復(fù)的數(shù)字時(shí)可以把數(shù)字轉(zhuǎn)成 Uint32Array 之類的 TypedArray 來(lái)省內(nèi)存。但要注意TypedArray 在去重這件事上并不會(huì)比普通數(shù)組快很多它主要省內(nèi)存不是省時(shí)間。真正要省時(shí)間還是要回到哈希表加 O(n) 循環(huán)這條路。希望這份實(shí)測(cè)記錄能幫你少走點(diǎn)彎路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷97C| 99热九九这里只有精品| 婷婷久久精品| 成人在线视频网| 2017狠狠干| 在线视频另类| 国产精品久久久久久久久久| 这里只有精彩视| 91人久| 日日懆天天懆| 亚洲啪啪网| 成人婷婷| 激情综合网,婷婷五月天| 这里只有精品96| 久久久精品人妻录| 激情四射五月天| 拍真实国产伦偷精品| 色五月激情基地| 色婷婷成人久久| 91九色视频在线观看| 五月丁香成人| 五月婷婷色在线| 无码网站视频| 五月丁香六月色婷| 久久日本wwww色| 丁香五月婷婷五月天| 久久色婷婷| 极品人妻VIDEOSSS人妻| 丁香久久综合| 五月天激情综合10p| 在线看av| 国产无套精品一区二区| 亚洲性爱电影| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 99久久精品网| 亚洲性爱电影| 五月婷婷丁香日韩在线| 在线播放中文字幕| 青草激情综合| 五月婷婷狠天天色综合| 97婷婷丁香| 91热爆在线| 丁香五月天激情综合网| 色婷婷av在线观看| 日都一级A片| 天天色视频| 欧美日本一区二区三区| 久热精品视频在线观| 影音先锋男人女人| 婷婷五月天开心网| 婷婷色五月婷| 五月久久丁香| 五月婷婷丁香伦理网| 性爱人人网| 五月天大香蕉| 91九色视频| 久色五月婷婷综合| 六月色日韩| 激情婷婷。| 99性爱视频| 激情综合五月婷婷六月丁香| 99热在线99| 色开心五月丁香| 狠狠操狠狠爱| 91viP在线看| 中文不卡一二区| 丁香五月天啪啪| 精品九九久久| 久久涩视频| 婷婷色婷婷| 激情五月狠狠| 亚洲欧美综合7777色亭亭| 国产精品日日躁夜夜躁| 夜夜骑夜夜撸| 五月婷婷开心综合| 思思热久久爱| 色情久久久| 99久久精| 六月丁香婷| 一区二区三区四区牛| 亚洲高清在线| 日韩操人| 久久精品婷婷| 激情婷婷五月| 人人干女人| 我要看激情五月天| 视色综合| 五月天激情子轮| 久久99这里只有精品| 人妻中文av| 亚洲精品又粗又大又爽A片| 婷婷99视频精品| 亚洲aV写真天天综合网久久| 骚货艹网站视频| 天天五月香欧美| 色情婷婷。| 亚洲国产黄色电影| 91成人看| 激情AV中文| 五月 婷 久| 日日做A爰片久久毛片A片英语| PORNY九色9l自拍视频成人| 天天狠狠夜夜狠狠2023| 《蜘蛛女》梁铮1995| 很很干五月天| 丁香五月冃欧美| 日本va网站| 国产激情久久| 夜夜躁狠狠| 婷婷五月天综合久久| 亚洲精品成人片在线播| 99在线视频免费| 九九热99精品| 九九人人自拍| 天天操无码| 婷婷色吧| 国产免费AV网站| 99re热在线观看| 久久99jiu9| 九月婷婷在线视频| 五月色激情综合网| 久久激情五月网| 91久久18| 久久久五月天网站| 久99视频在线观看| 开心久久xxx色| 婷婷五月激情四月综合 | 丁香五月另类色婷婷麻豆| 丁香久月婷| 婷婷亚洲久久| 97人人看| 精品一二三区视频立| 欧美欧盟性爱网| 婷婷香香五月| 天天干夜夜b| 亚洲一区先锋影音| 伊人久久大香线蕉av一区| 婷婷终合色图| 亚洲九区| 五月婷婷,六月激情| 色欲日日躁| 丁香五月激情六月| 丁香五月婷婷六月| 婷婷五月天黄色| 人人摸人人摸| 97操碰人免费| 超碰电影在线播放| 婷婷丁香高潮了| 亚洲十月婷婷综合| 久久五月天综合| 久久99精品久久久久久噜噜| 色五月综合网| av电影在线播放| 久色88| av在线免费网站 | www.婷婷五月| 久久精品一区二区三区四区| 日本全黄一级999| 欧美日韩五月婷婷| 婷婷基地成人五月天| 激情婷婷人妻| 色五月婷婷五月天| 亚洲精品一区中文字幕乱码| 欧美在线视频9| 丁香六月激情| 操丝袜视频影院导航| 日日天天干| 九月激情网| 成人做爰A片免费看网站找不到了| 色色色激情网| www.超碰在线| 亚洲五月情| 久久性爱视频| 最新无毒无码AV| 六月综合婷婷开心伊人| 日韩狠狠色婷婷| 天天碰夜夜爽| 五月久久噜噜| 5五月综合网亚洲| 五月天播播| 影音先锋五月婷婷| 欧美日韩成人在线| 亚洲丁香婷婷丁香五月天激情| 亚洲热热视频| 久久新地此| 九九热免费观看视频| 五月天久久综合婷婷丁香| www.maotanji.com| 亚洲AV久久久久久久久久久久久久久久| 五月开心久久| 狠狠草综合网| 久草婷婷| caop在线视频| 天天色色天天| 天天射影院| 亚洲人人操| 日本无va视频| 99热综合| 亚洲色色五月天| 99成人精品六| 91久久久久久久| 亚洲综合五月天婷婷| 五月婷婷色综图片| 精a品a| 噼里啪啦完整版中文在线观看| 影音先锋天天日| 亚洲 在线 性爱| 亚洲AV网址| 91婷婷视频| 69热在线| 六月久久婷婷| 色原狠狠综合| 99热色在线精品| 亚洲天天操| 大香婷婷| 99爱视频在线播放| 伊久大香蕉| 热中文字幕| 婷婷五月六| 激情操逼婷婷| 操逼福利视频| 欧美 日韩 人妻 高清 中文| 丁香九月综合| 久久九九色| AV色婷婷| 一区视频网站| 丁香五月婷婷激情尤物| 亚洲精品午夜国产va久久成人| 99热最新| 玖玖在线视频| 久久综合人妻| 婷婷月五天在线在线看| 综合五月婷婷| 全亚洲最大的婷婷五月天网站COM| 五月婷婷成人| 久久 中文 日本| 台湾佬天天日丁香婷婷五月天| 色五月婷婷在线| 色婷婷伊人| 五月天激情婷婷| 在线一起草av| 婷婷金品综合视频| 久久五月天丁香| 婷婷综合伊人丁香| 亚洲中文字幕在线电影| 丁香五月综合在线观看| 人妻在线网站| 超碰在线综合| 五月丁香操婷逼| 九九色天堂| 六月丁香婷婷五月| 国洲夜色亚热在线久久| 婷婷五月激情六月| 久久精品婷婷五月丁香| 人妻AV在线观看| 欧美激情综合色综合啪啪五月| 99色色网| 97人人看| 日本三级韩三级99久久| 五月天快乐开心激情网| 国产成人AV不卡| 色综合五月婷婷狠狠干| www.91av.com| 日本颜色视频人人爱| 182tv992tv人之初午夜免费观看| 99热这里只有精品免费观看| 久久在线大香蕉| 五月婷婷|欧美| 九九热精品99| 天天干天天干天天| 丁香六月婷婷综合网| 九九视频在线观看视频6 | 亚洲中文无码成人| 97超碰,人人舔,人人操,人人摸| 99aese| 丁香五月综合网| 激情婷婷五月天在线观看| ztEJj| 九九精品在线观看视频6| 伊人久久大香线蕉AV最新午夜| 天天爽天天日| 九九香蕉网| www.夜夜操| 狠狠干2007| 国产性av| 色婷五月天| 任你爽精品免费视频6| 99爱免费在线观看| 日韩ww| 96五月丁香熟女| 天天网曰日曰夜夜综合永久免费| 特黄三级片| 欧美狠狠草| 日韩一级一片内射视频4K| 五月婷婷精品无在线| 欧美啪啪五月天| 99热在线精品播放| 综合五月亭亭9| 任你爽在线视频| 五月亭亭开心网| 思思99热这里只有精品| 久9综合| 婷婷五月天色播| 丁香五月天黄色片| 69超碰在线| 五月激情久久| 五月丁香六月综合情在线观看| 亚洲精品国产熟女久久久| 婷婷丁香在线播放| 亚洲操操| 超碰免费电影| 色婷婷九月| 日日操人人操| 在线观看的av| 激情五月婷婷综合秋霞| 91色久| 26uu| 深夜男女福利刺激影院一区完整| 五月丁香色停停啪啪啪| 91色在线/日韩| 五月丁香亭亭成人电影| 久久久久网站| 97大香蕉五月天| 色婷精品91| 五月丁香六月婷婷免费视频| 91精品婷婷国产综合久久| 日韩黄在免| 激情亭亭五月| 激情五月亚洲| www.91.com处女在线直播| 人操91在线| 亚洲五月婷婷| www.jiujiujiu| 亚洲精品小视频| 综合99综合久久久久久久| 99久久国产宗和精品1上映| 黄色一级影片| 99这里是精品| www.五月天性.com| 激情五月婷婷综合| 97色婷婷在线观看| 婷婷五月丁香综合瑟瑟| 欧美性猛交AAAA片黑人 | 99热九九在线| 五月综合激情啪啪啪啪啪| 9l视频自拍9l视频自拍九色学生| av操一操| 天天拍夜夜爽| 第四色色六月色综合| 亚洲乱啪| 激情都市另类| 狠狠综合网| 亚洲综合草草| 婷婷六月综合激情| 99视频网| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 欧美在线97| 99超碰欧美| 丁香五月欧美| 综合激情五月丁香| 久久婷婷91| 一级二级香港秋霞欧美欧美秋霞| 婷婷5月开心6月| 婷婷六月色| 亚洲午夜电影| 97碰成超视频免费视频| 激情婷婷黄色五月| 97成人在线视频| 国产国产乱老熟女视频网站97| 超碰在线观看99| www.婷婷六月天| 色99欧洲色19| 久久人妻高清中文| 久噜久噜| 1010日日无码| 日本不卡五月婷婷丁香| 久久性爱网站| 六月婷婷色五月| 五月丁香视频在线观看| 大香蕉五月丁香| 婷婷五月中文字幕| 久久久潮喷-久久久九九-成人AV| 色综合综合综合| 国外亚洲成AV人片在线观看| 日本不卡高字幕在线2019| 婷婷色五月天在线观看| 色丁香五月婷婷| 日韩AV大全| 色婷婷综合影院| 99热这里只有精品4| 婷婷五月色網站| 色婷婷狠狠色| 成人综合伍月天| 都市激情小说婷婷| 99视频这里有精品免费观看| 99精品亚洲| 九九热经典视频在线观看| 99精品网站| 久久这里只有精品无码| 亚洲久热无码| 永久精品| 婷婷激情人妻| 国产成人99久久亚洲综合精品| 亚洲中文字幕AV| 亚洲成人AV在线播放| 九九99精品视频| 99在线免费视频| 色婷婷69| 九九这里有精品| 精品久久99码| 久久小说网| 成人AV在线中文版| 日本大逼91| 中文在线视频久9| 99色日本| 久热这里只有精品3| 开心丁五月| 深爱激情小说五月婷婷| 丁香六月天之亚州热女| 噜噜狠狠色综无码久久合欧美| 亚州激情九月| 免费黄色AV| 九九精品在线视频观看| 美女要搞搞天天搞搞搞网站| 新伍月婷婷| 婷婷国产成人| 五月天婷婷基地| 92久久精品一区二区| 婷婷五月欧美综合| 伊人久久综合| 深爱五月月天| 天天狠狠色| 强伦轩人妻一区二区电影| 色色色婷| 99成人| 天堂久久久久天堂网| 亚洲AV永久无码影院黑人 | 色婷綜合网| 日日夜夜天天爽| 婷婷五月激情丁香| 99操碰| 在线免费视频caop| www,色婷婷| 99免费成人网| 人人人人人人人草| 五月丁香婷婷基地| www免费在线视频| 激情久久综合网| 久久婷婷五月天| 亚洲行行色色| 天天肏视频| AA片在线观看视频在线播放| 操97免费超级视频| 丁香亚洲婷婷五月| 久久人人九九| A片天天| 婷婷激情四射网| 亚洲午夜精品久久久久久人妖| 久99久热只有精品国产99| 五月丁香婷婷成人网| 成人在线99| 五月婷无码| 影音先锋色婷婷| 深爱丁香激情| 人妻AV在线| 内射 无码 伊人| 97香蕉碰碰人妻国产欧美| 亚洲国产成人裸舞| 99热最新| 婷婷五月激情五月丁香五月| 亚洲舔观看| 人人摸人人澡人人| 激情五月丁香五月综合| 丁香六月啪啪| 五月丁香综合激情| 大香蕉久久视频久久视频 | 久草热久草在线视频| 热99久| 色播五月丁香婷婷| 国产激情久久久| 玖玖九九9999在线观看视频精品| 丁香五月色综合色播五月| 高清无码入口| 97操资源婷婷| 亚洲婷婷五月草久| 91精品综合久久久久久五月丁香| 久xxxx| 婷婷开心综合人妻小说网址| 人人摸人人| 欧美va在线| 丁香婷婷浪潮AV久久综合| 亚洲中文丁香| 婷婷五月天综合久久| 一本到不卡高清DVD| 精a品a视a频| 五月天丁香综合久久国产| 99九九这里有免费视频| 色婷婷在线综合色播网| 九九色热| 91日本在线观看| 亚洲精品永久久久久久| www...com黄在线观看| 99热最新地址在线| 日韩精品999| 婷婷五月乱交换| 国产99视频永久免费| 日本婷婷| 亚洲一个色| 综合激情在线视频| 99人人操人人爱久久久| 亚洲成人婷婷| 五他月天啪啪啪| 久热中文字幕在线线观看 | 日韩在线观看亚洲| 91精品啪| 丁香五月婷老师| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 婷婷五月丁香激情色情| 国产这里只有精品| 天天操天天爱天天日| 婷婷丁香亚洲色综合91| 亚洲一级AV在线免费播放| 怡红院一二三| 9一精品视频观看| 色综合天天天天做夜夜| 天天日天天干天天天| 亚洲av| 六月激情婷婷综合| 人与禽A片啪啪| 5月色亭亭视频| 婷婷久久五月天| 国产亚洲精品人人| 亚洲人妻av伦理| 天天日天天干天天爱| 免费亚洲婷婷| 好好日激情五月天| 亚洲亚洲人成综合网络| 色婷婷九月综合| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 婷婷五月天无码熟女| 天天日天天色| 亚洲五月综合色播| 久久大香蕉丁香| 另类激情五月| 日本丰满久久| 五月天丁香| 成人永久免费视频在线观看| 丁香色五月 97干| 超碰人妻在线| 国产美女无遮挡裸体毛片A片| 婷婷丁香五月天欧美| 国产又色又爽又黄又免费| 色视五月天婷婷| 久久六月婷婷| 五月丁香六月玩女人| 欧美日比视频| 超碰99热| 五月婷婷网站| 久婷婷色| 日日操日日撸| 激情婷婷狠狠干| 丁香五月婷婷综合激情哟哟哟| 丁香五月天啪啪a日本| se99热久久一本| 91九色国产在线| 久久久婷婷| 无码少妇高潮喷水A片免费| 久久久久人无码人妻| 五月天丁香花婷婷| 五月天综合久久| 色之综合网| 婷婷丁香18| 激情五月丁香亭亭 | 婷婷干五月综合在线播放| 91性人人| www.五月天| 婷婷五月丁香性爱| 黄色成人网站在线播放| 亚洲激情淫网| 99在线免费视频播放| www.91在线观看| 色婷婷黄色网络| 亚洲av| 婷婷 色 丁香 夜| 激情av| 亚洲精品白浆高清久久久久久| 色情综合网| 人人操插| www.seqingwuyuetian| 无码色色色| 丁香五月激情天AV无码| 另类国产欧美视频| 五月婷婷色五月| 久久久五月婷婷| 色综合天堂| 国产69久久久欧美黑人A片| 夜夜干夜夜操| 国产日批视频| 亚洲午夜一区二区| 欧美成人一区二区三区在线视频| 天天肏天天肏天天肏| 九九爱这里只有精品| 岛国资源站| 99超级碰免费视频| 日日干夜夜干| 五月丁六月婷| 青青.com| 婷婷成人在线| 99精品偷自拍| 久久色情| 青草青青草| 久久婷婷丁香五月一二三| 九九美女视频| 无码人妻丰满熟妇奶水区码| 97色久| 丁香色情五月综合网站| 26uuu青青| 日本美女五月天| 婷婷丁香综合| 欧美成人猛片AAAAAAA| 亚洲视频二区| 婷婷五月丁香伊人| 色婷婷婷综合五月天| 91精品又长又大又粗又爽又猛| 婷婷视频在线| 91一起操| 97久久久| 99激情| 五月花婷婷最新| 久热伊人| 99久超碰| 五月色婷婷综合| 婷婷五月天777| 久久婷婷综| 婷婷中文网站| 欧美久久九九| 96精品成人无码A片观看金桔| 超碰91在线| 丁香婷婷社区| 五月丁香淫淫婷婷婷| 色综合久久88色综合天天人守婷| 色播五月丁香| AV在线免费播放| 在线看av| 久久无意婷婷| 色婷婷AV在线观看| 大香蕉 婷婷| 五月色综合| 99热精品在线| 99九九综合久久九九| 99免费| 五月婷婷精品无在线| AV 3P| 九九热视频网站| 91九九| 超碰免费人妻| 六月婷久久| 2015超碰| 香蕉网久久| WWW、日本色丁香、co m| 日本人人超碰| 午夜天天精品视频| 草草色情综合网| 成人无码髙潮喷水A片| 欧美色色色| 久久综合激情| 热久久这里只有精品| 超碰在线国产| 欧美成人精品三区综合A片| 天天做天天爱天天爽| 欧美人妻一区二区| 中文字幕成人| 激情综合网五月| 色五月激情五月| 99热97| 涩涩五月天| 夜夜爱网站| 色婷婷www| 九九AV| 五月婷婷激情综合| 99热这里只有精品55| 久草五月天| 色婷婷丁香五月| 在线日韩视频| 亚洲第一成人无码A片| 婷婷午夜天| 五月天激情国产综合婷婷| 国产在这里只有精品| 99免费视频| 久久99操| www99热| 日本欧美成人片AAAA| 黑人巨粗进入警花疼哭A片| 中文字幕 中文字幕明步| 狠狠爱深色婷婷综合| 999热视频精品99免费在线| 最新国产AV| 丁香六月激情毛片| 色色激情网| 性色欲情 网站| 色婷婷六月激情| 亚洲综合狠狠艹| 丁香六月欧美| 精品久热| 99热国品| 激情色情五月天| 99久精品视频| 色欲Av五月天| 性99网站| 激情综合网五月| 激情小说五月天| 91精品久久久久久久久久| 31色区视频免费看| 九色91美女| 婷婷五月蜜桃成人桃色丁香| 丁香五月,激情五月,深爱五月| 久久99网| 中文av网| 久久婷综| 五月天三级久久| 五月丁香婷婷福利| 色综合色综合色综合| 欧美视频五区| 成人精品一区日本无码网| 欧美日韩国产成人在线| 玖玖综合网| 蜜臀九九九九| 色噜噜五月天| 极品人妻VIDEOSSS人妻| 中文在线成人| 中文久久久人妻| 亚洲第一精品成人999久久精品| 五月综合激情| 五月天婷a在线| 色五月天丁香婷婷| 色综合开心五月深爱五月| 日日夜夜狠狠| 色狠狠色噜噜AV天堂五区| 日韩伊人大香蕉| 99久热这里有精品| 久色| 婷婷不干网| 色五月超碰| 婷婷六月久久| 亲子乱AV一区二区三区下载| 狠狠干最新地址| 欧美激情综合色综合啪啪五月| 国内外色色色色色成人视频| 大香蕉七区| 五月视频日本免费观看| 亚洲免费av在线| AV大片在线播放| 婷婷五月电影院| 国产精品热搜丁香五月婷婷| 99热99色| 狼友超碰| 99热12| 开心激情五月天网| 国精产品一区二区三区| 深爱开心五月天| WWW99热| 婷婷中文综合网| 操笔无码| 久久久婷婷婷| 性爱五月婷婷| 精品久久久久久久久久久久人妻| 九九热视频精品| 婷婷亚洲久久| 天天热夜夜操| 激情五月综合网| 亚洲熟女色| 欧州色色| av网站不卡在线| 亚洲综合网区| 99丁香五月婷| 青青久久91| 久久伊人日日夜夜| av在线资源| 久久婷婷五月综合色奶水99啪| 99久久大片| 日本不卡高字幕在线2019| 色婷婷99| 久久久久久久97| 亚州色综合| 一级二级香港秋霞欧美欧美秋霞| 五月婷婷综合网| 激情综合婷婷| 啪啪99| 色五月中文字幕| 婷婷5月九九| 图片区 小说区 区 亚洲五月| 五月天综合网| www.色五月.com| 二级黄色毛片| 婷婷五月激情六月| 丁香伊人五月色婷婷五十路| 。久久久久久久久久久久久久人妻 | 色婷久久| 天天操精品| 五月天六月婷| 中文不卡av| 美女激情婷婷| www.五月天婷婷姐姐| 日本婷婷| 激情五月婷黄版| 97人人干人人操| 久久婷婷国产| 99在线视频精品| 亚洲无码11| 狠狠爱婷婷丁香| 色在线99| 丁香五月中文字幕| 五月丁香亭亭操逼| 七七九色| 欧美啪啪9| 久大香蕉| 996er热| 色欲丁香| 网色99| 日本片日本片祼观看网站在线看中文版网页在线看| 日韩av在线免费观看| 五月丁香久久| 色色色五月婷| 人人澡玖玖一| 狠狠色色| 天天综合精品| 99热九九这里只有精品10| 亚洲成人在线播放| 伍月激情天| 丁香婷婷天堂| 九九热在线99| 超级碰碰碰碰视频| 高清视频一区| 亚洲精品乱码久久久久久按摩观| 六月婷婷激情| 婷婷五月天,影院| 五月综合激情久久| 天干夜夜操| 久久久五月婷婷| 久99| 日韩成人网站精品久久大全| 亚洲亚洲人成综合网络| 五月丁香婷婷激激激综合网色播| 182tv992tv人之初午夜免费观看| 99精品视频网站| 成人婷婷| 99热伊人| 日本性激情色播| 久久伊人婷| 九九99免费视频| 九九综合久久丁香婷婷,开心激情综合网| 免费视频WWW在线观看网站| WWW.色婷婷.COM| 激情 婷婷| 久久综合人妻| 蜜乳国产网站| 国产综合81p| 婷婷狠狠干| 99色播| 99热99天堂| 五月丁香婷婷色色| 丁香六月婷婷久久综合| 伊人深爱综合| 五月天三级久久| 超碰91在线| 狠狠干思思热| 日韩 中文 欧美| 五月丁香婷婷色| 六月丁香久久| 婷婷丁香六月| 最新无码专区| www.9797国产| 99这里只有精品8| 97成人在线视频| 国产激情综合| 六月亭亭久久综合激情| 激情亚洲婷婷| 国外亚洲成AV人片在线观看| 一丁香五月天月AV| 99丁香五月婷| 97人人干。| 狠狠五月天| 激情五月天伊人av| 久久丁香五月综合六月激情红杏视频| 五月丁香婷婷钟和色图| AV在线大香蕉| www.sezonghe| www激情| 久久婷婷五月综合网| 色色五月丁香婷婷| 美女激情婷婷| 色综合天堂| 伊人丁香在线| 亚洲九区| 99热这里只有精品最新| 九九综合精品| 97超碰99热99| 91狠狠色丁香婷婷综合久久精品| 蜘蛛女侠2003满天星免费观看| 丁香五月婷婷久久综合激情网 | 久久丁香九| 啪啪91| 五月亭亭开心网| 丁香五月天婷婷久久| 婷婷五月丁香欧洲| 婷婷色五月大香蕉在线| 亚洲天堂99| 思思精品热在线| 婷婷五月天改成什么了| 久久婷婷丁香视频网| 国产精品成人AV在线观看春天 | 久久刺激网| 五月婷婷激情啪啪| 超碰久热| 天天肏在线观看| 91久久婷婷人人澡草| 99色在线观看免费| 超碰高清在线| 婷婷激情五月呦呦| 五月天啪啪啪| 蜜臀99精品| 97人人干视频| 91超级碰碰碰| 婷婷精品免费久久| 国产精品VA在线| 婷婷综合五月色播| 色五月久久成人婷婷| 五月天丁香网站| 天色综合网| 91av视频| 亚洲乱码日产精品BD| 国产超碰在线| 97色啪| 天天日,天天射,天天舔| 欧洲激情五月天| 天天操天天日天天爱| 婷婷午夜综合| ...婷婷五月综合不卡,国产在线手机| 久99999热视频在线观看免费| 99爱在线视频| 91成人品| 色99热| 狠狠操狠狠操AV| 婷婷五月天激情五月天网站| ,99视频久久| 欧美在线视频99| 中文字幕AV网址| 亚洲爱婷婷| 伊人影院久久网| 久久人人添人人爽添人人片αV| 欧美成人精品三区综合A片| 性爱视频99| 丁香五月综合| 97在线综合| 色婷婷中文在线| 99热亚洲精品| 精品爆操| 五月激情网站| 久久在线大香蕉| 中文av网| 五月天婷婷激情在线色图| 婷婷五月天干干| 人人人操B超碰| 久久99热精品a片在线观看| 五月丁香六月婷婷中文版| 五月天婷婷三级黄| www。狠狠干。com| 久久杏爱视频| 狠狠擼综合| 婷婷操逼网| 综合久久五月| 天天xxxxxx天天日| 国产一二三四五六七八视频| 激情性五月天免费小说视频| 丁香五月开心婷婷| 激情五月丁香六月| 婷婷色正月| 思思热视频| 操97免费超级视频| 成人 在线 日韩| www.99视频| 色人久久| 五月开心播播网| 久久婷婷五月综合色丁香花| 丁香五月大香蕉在线99| 北条麻妃伊人 | 亚州欧美国产久精国产99综合视频| 華人性愛AV在線| 丁香五月婷婷动漫视频| 亚洲婷婷丁香五月视频| 一级二级香港秋霞欧美欧美秋霞| 色五开心五月五月深深爱| 这里只有精品1| 九九大香蕉黄色影院| 殴美日比视频| 欧美精品999| 丰满少妇猛烈A片免费看观看 | 日欧一片内射VA在线影院| 韩日另类| av一区免费看| 久人操| 先锋五月婷婷丁香草草| 97精品综合久久| 激情小说五月天| 97日本在线播放| 99热官网精品在线| 98色花堂98t.R| 久久机热这里只有精品免费视频| 狠狠久久婷五月综合色| 久久欧洲综合网| 亚洲色色色| 综合网天天| 成人中文网| 色爱综合五月| 欧美性爱五月天| 天天操天天操| 激情综合网五月| 久热九九| 超碰国产在线播放| 人人叉久| 99er6免费视频热播| WWW五月天| 欧美人妻一区二区| 五月婷婷欧美| 亚洲乱码日产精品BD在线观看| 色天使久久综合| 久久99激情| 婷婷AV丁香| 五月激情网站| 久操大香蕉| 亚洲欧洲另类图片| 丁香五月综合激情性爱| 在线区区区| 九九热在线视频观看| 五月丁香免费看| 婷婷色网址| 超碰99热| 亚洲AV成人无码久久精品老人法拉利| 操九色| 国色天香成人网| 九九人人看| 色色色色色色色综合| 99精品视频网站| 另类视频五月天| 99视频日韩| AV激情五月| 色狠狠色综合| 五月丁香在线观看| av一区免费看| 日韩一区二区在线播放| 亚洲婷婷五月天激情| 伊人激情| 狼人婷婷综合| 开心五月综合激情综合五月| 综合视频久久| 爱99干99| 婷婷五月天激情小说| 丁香五月综合亚洲| 久久性爱视频| 97男人天堂| 激情五月天啪啪视频| 久久久噜噜噜久久人妻| 日日夜夜天天| 精品网站:999WWW| 这里只有精品久| 五月天另类小说| 人妻在线网站| 亚洲色欲欧美一区二区三区| 久久九九@| 懂色av粉嫩AV蜜臀AV| 久久99热这里只有| 色婷婷综合影院| 亚洲无码 图片区| 538午夜激情| 蜜桃人妻无码AV天堂三区| AV网在线| 丁香五月天在线观看视频| 五月天婷婷丁香| 9久久狠狠的| 免费九九热| 可以看的av| 无码橾| 日本不卡高字幕在线2019| 狠狠综合久久| 五月丁香五月综合欧美| co超碰在线观看| 五月婷婷丁香成人网| 久久精品五月天| 丁香花狠狠婷婷亚洲中文字幕| 梁铮版《蜘蛛女侠》在线| 亚洲六月婷婷| 在线99精品| www色综合| 亚洲中文字幕AV在线| av在线超清中文| 综合久久婷婷| 丁香婷婷色色| 操操操Av| 久久日本wwww色| 五月丁香六月色婷婷| 激情婷婷五月| 日韩狠狠色| WWW.17C亚洲精品| 激情文学 综合 九月| 天天爽综合| 亚洲国产精品二二三三区| 性色人人爽| 亚洲综合九九| 任你日视频| 国产免费一区二区三区三州老师F1F1.CC | 婷婷五月天激情五月天网站| 精品人妻伦九区久久AAA片| 婷婷五月天成人导航| 综合色五月天| 超碰免费大香蕉| 色五月婷婷五月天| 日本情色一区二区| 99热这里只有精品2| 婷婷不卡基地| 操射国产日本| 超碰cap| 亚洲婷婷成人五月天| 高清资源站日A美A欧亚…| 丁香香五月激情免费视频| 99在线精品视频在线观看| www.久久久.com| 久久久8| 91热在线| 日夜操B| 婷婷啪啪| 99色热| 国产1区2区3区在线观| 伊人在线视频| 丁香五月婷婷婷婷欧美综合| 婷婷综合仓库中文| 亚洲乱码日产精品BD| 五月婷婷六月丁香综合视频在线| 激情五月色婷婷| 亚洲综合视频天天精品| 色婷婷99| 高清无码 一区 二区 三区| 狠狠穞A片一區二區三區| 777.色色| AA片在线观看视频在线播放| 森林影视大全,最好看的2019年视频 | 啪啪操超碰| 狼友超碰| 9久久婷婷国产综合精品性色| 天堂色色色| 伊人网碰碰| 99re热在线视频| 天天色视频| 婷婷区日本| 97夫妻超碰| 激情六月一二| 色婷婷精品视频| 青青草原亚洲天堂| 天天曰夜夜爽| 国产亚洲成AV人片在线观黄桃| 欧美毛片www| 狠狠色综合无线观看| 另类激情综合| 日本 欧美在线| 久操婷婷| 五月婷婷花| AV免费在线网站| 色五月天丁香婷婷| 狠狠五月婷婷| 婷婷色中文字幕| 人妻狠狠操| 欧美大肥婆大肥BBBBB| 色色色色色色色色色999| 99热欲| 七七九色| 天天五月香欧美| 午夜无码熟熟妇丰满人妻| 91精品综合久久久久久五月丁香| www.色婷婷.com| 婷婷爱五月天| 涩五月丁香| 97操碰在线视频| 天天干天天干天天干| 婷婷五月天成人基地| 91chinese 在线| 亚洲精品亚洲人成人网| 97五月天婷婷| 超碰成人av| 丁香六月综合激情| 激情综合色播| 深夜男女福利刺激影院一区完整| 国产做爰视频免费播放| 噜噜色com| 91干| 伊人丁香在线| 久久婷婷五月天激情四射| 婷婷激情五月天网站| 亚洲丁香婷婷| 99久.| 婷婷五月天影视| 大香蕉Av在线| 五月丁香婷婷综合| 五月丁香啪啪综合| 日本三级大片| 一级内射毛片| 天天日夜夜拍| 丁香成人色情五月天| 色综合婷婷| 99A片| 五月婷婷影院| 丁香五月六月欧美| 色综合久久天天综合网| 日本啪啪视频HD| 婷婷五月综激情| 天天日,夜夜爽| 九热免费视频| 五月网站| 久激情网| 激情六月一二| 五月天大香蕉| 92久久久| 久久久97| 国产欧美va| 深夜婷婷五月丁香| 久久婷婷综合国产| 久久综合久色欧美综合狠狠| 91ncm视频| 日日日影院| 五月婷婷新网站| 丁香玖玖视频大全| 高清资源站日A美A欧亚…| 97碰免费视频在线| 深爱激情六月| 亚洲成人色五月天| 五月婷婷六月丁香玖玖玫瑰91| 五月激情天| 99婷婷国产最新视频| 五月丁香成人| 免费亚洲婷婷中文字幕| 丁香五月 无码| 精品夜夜澡人妻无码AV| 色婷婷久久综合| 久久精品亚洲一级牲爱综合| 婷婷丁香五月天色播网站| 日本精品干| 91九九热| 无人区码一码二码三码医生系列| 丁香五月手机在线| 国产精品热搜丁香五月婷婷| 精品无码av丁香五月激情| 99日逼视频| 97久久精品视频| 色婷五月| 五月天激情影院| 天天综合网在线| 丁香五月中文字幕久色| 成人短视频免费| 九九99精品免费播放| 日本三级日本三级99| 99在线观看精品| 欧美成人性爱网| 深爱五月中文字幕| 色色热99| 国产成人+综合亚洲+天堂| 99人人干人人| 亚洲久艹| 久久您您综合网|