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

unordered_map 性能被吊打!我用基數樹讓內存池性能暴漲幾十倍的秘密

開發
基數樹真的是一個被低估的數據結構。在合適的場景下,它能帶來數倍甚至數十倍的性能提升。

今天要和大家聊一個特別有意思的話題——基數樹。

說實話,我第一次聽到這個名詞的時候,內心是懵逼的。基數?樹?這玩意兒到底是啥?

直到有一天,我在研究TCMalloc內存池源碼的時候,發現了一個神奇的現象:為什么Google的工程師不用std::unordered_map來做頁號映射,而要自己實現一個看起來很復雜的數據結構?

帶著這個疑問,我深入研究了一下,結果發現了一個寶藏——基數樹!

一個讓我震驚的性能對比

先來看個數據,直接震撼你的小心臟:

測試場景:100萬次查找操作
std::unordered_map:    40878微秒
基數樹:               714微秒
性能提升:             57.2521倍!

這還只是中等規模的測試,在大規模場景下,差距會更加夸張。

基數樹到底是個啥玩意兒?

好,現在我用最通俗的話給大家解釋一下基數樹。

簡單粗暴地說,基數樹就是一個超級大數組!

沒錯,就這么簡單。

比如你要存儲鍵值對,傳統的做法是:

  • std::map:用紅黑樹,需要比較、旋轉,O(log n)時間
  • std::unordered_map:用哈希表,需要計算哈希、處理沖突,平均O(1)但有常數開銷

而基數樹呢?直接把鍵當作數組的下標!

// 傳統方式
unordered_map[123] = ptr;  // 需要計算hash(123),可能還要處理沖突

// 基數樹方式
array[123] = ptr;          // 直接訪問!O(1)且常數極小

是不是超級簡單?

動手實現一個基數樹(一級)

talk is cheap,show me the code!

const uint32_t MAX_KEY = (1 << 20) - 1;

// ============ 基數樹實現 ============
template<int BITS = 20>  // 20位,支持100萬條目 800 0000
class SimpleRadixTree {
private:
    staticconstsize_t SIZE = 1 << BITS;
    void** array_;
    
public:
    SimpleRadixTree() {
        array_ = newvoid*[SIZE];
        memset(array_, 0, SIZE * sizeof(void*));
        
        cout << "創建了支持 " << SIZE << " 條目的基數樹" << endl;
        cout << "理論內存: " << (SIZE * 8) / (1024) << " KB" << endl;
    }
    
    ~SimpleRadixTree() {
        delete[] array_;
    }
    
    // 設置鍵值對 - O(1)時間!
    void set(uint32_t key, void* value) {
        if (key >= SIZE) {
            cerr << "錯誤: 鍵 " << key << " 超出范圍 [0, " << (SIZE-1) << "]" << endl;
            return;
        }
        array_[key] = value;
    }
    
    // 獲取值 - O(1)時間!
    void* get(uint32_t key) {
        if (key >= SIZE) returnnullptr;
        return array_[key];
    }
    
    // 刪除鍵
    void remove(uint32_t key) {
        if (key < SIZE) {
            array_[key] = nullptr;
        }
    }
    
    // 統計已使用的條目數
    size_t count_used() const {
        size_t count = 0;
        for (size_t i = 0; i < SIZE; ++i) {
            if (array_[i] != nullptr) {
                count++;
            }
        }
        return count;
    }
    
    // 獲取支持的最大鍵值
    uint32_t max_key() const {
        return SIZE - 1;
    }
};

就這么幾行代碼,我們就實現了一個高性能的一級基數樹!

基數樹的核心:用空間換時間。

性能大PK:基數樹 VS unordered_map

我專門寫了個測試程序,在我的Ubuntu機器上跑了一下:

void performance_battle() {
    cout << "\n========== 性能大PK開始 ==========" << endl;
    
    constint TEST_COUNT = 1000000;
    
    // 準備測試數據
    vector<uint32_t> keys;
    cout << "準備 " << TEST_COUNT << " 個測試鍵..." << endl;
    for(int i = 0; i < TEST_COUNT; i++) {

        keys.push_back(i);  
    }
    
    cout << "數據準備完成,開始測試..." << endl;
    
    // ========== 測試 unordered_map ==========
    cout << "\n測試 unordered_map..." << endl;
    unordered_map<uint32_t, void*> hashmap;
    auto start = chrono::high_resolution_clock::now();
    
    // 插入測試
    for(int i = 0; i < TEST_COUNT; i++) {
        hashmap[keys[i]] = reinterpret_cast<void*>(i + 1);
    }
    
    // 查找測試
    for(int i = 0; i < TEST_COUNT; i++) {
        volatilevoid* result = hashmap[keys[i]];
        (void)result; // 防止編譯器優化掉
    }
    
    auto end = chrono::high_resolution_clock::now();
    auto hashmap_time = chrono::duration_cast<chrono::microseconds>(end - start);
    
    // ========== 測試基數樹 ==========
    cout << "測試基數樹..." << endl;
    SimpleRadixTree<20> radix_tree;
    start = chrono::high_resolution_clock::now();
    
    // 插入測試
    for(int i = 0; i < TEST_COUNT; i++) {
        radix_tree.set(keys[i], reinterpret_cast<void*>(i + 1));
    }
    
    // 查找測試
    for(int i = 0; i < TEST_COUNT; i++) {
        volatilevoid* result = radix_tree.get(keys[i]);
        (void)result; // 防止編譯器優化掉
    }
    
    end = chrono::high_resolution_clock::now();
    auto radix_time = chrono::duration_cast<chrono::microseconds>(end - start);
    
    // ========== 輸出結果 ==========
    cout << "\n=== 性能大PK結果 ===" << endl;
    cout << "測試規模:       " << TEST_COUNT << " 次操作" << endl;
    cout << "unordered_map:  " << hashmap_time.count() << " 微秒" << endl;
    cout << "基數樹:         " << radix_time.count() << " 微秒" << endl;
    
    if (radix_time.count() > 0) {
        double speedup = (double)hashmap_time.count() / radix_time.count();
        cout << "性能提升:       " << speedup << " 倍" << endl;
        
        if (speedup > 5) {
            cout << "基數樹性能碾壓!" << endl;
        } elseif (speedup > 2) {
            cout << " 基數樹明顯更快!" << endl;
        } else {
            cout << "性能相當" << endl;
        }
    }
    
    // 驗證結果正確性
    cout << "\n驗證結果正確性..." << endl;
    bool correct = true;
    for(int i = 0; i < 1000; i++) {  // 驗證前1000個結果
        void* hash_result = hashmap[keys[i]];
        void* radix_result = radix_tree.get(keys[i]);
        if (hash_result != radix_result) {
            cout << "結果不一致!鍵: " << keys[i] << endl;
            correct = false;
            break;
        }
    }
    
    if (correct) {
        cout << "結果驗證通過,兩種方法結果一致!" << endl;
    }
}

在我的機器上跑出來的結果:

=== 性能大PK結果 ===
測試規模:       1000000 次操作
unordered_map:  40878 微秒
基數樹:         714 微秒
性能提升:       57.2521 倍

50+倍的性能提升! 這還只是中等規模的測試。

為什么會有這么大的差距?

  • 基數樹:直接數組訪問,沒有任何額外計算
  • unordered_map:需要計算哈希值、處理沖突、內存分散訪問

基數樹在內存池中的神奇應用

現在來看看基數樹的實際應用場景——內存池!

在內存池系統中,我們需要根據內存地址快速找到對應的內存塊信息(Span)。

傳統方式可能是這樣:

// 傳統內存池的頁號映射
unordered_map<PageID, Span*> page_to_span;

// 哈希查找,較慢
Span* find_span(void* ptr) {
    PageID page_id = (uintptr_t)ptr >> 12;  // 假設4KB頁面
    std::lock_guard<std::mutex> lock(map_mutex_);// 還要加鎖
    auto it = page_to_span.find(id);
    return (it != page_to_span.end()) ? it->second : nullptr;   
}

用基數樹優化后:

// 基數樹版本的頁號映射
SimpleRadixTree<28> page_map;  // 支持1TB地址空間

// 不需要加鎖
Span* find_span(void* ptr) {
    PageID page_id = (uintptr_t)ptr >> 12;
    return (Span*)page_map.get(page_id);    // 直接數組訪問,超快!
}

這就是為什么TCMalloc、jemalloc這些高性能內存池都在用基數樹的原因!

一個完整的內存池應用示例

// ============ 內存池應用演示 ============
struct Span {
    uint32_t page_id;
    uint32_t num_pages;
    bool in_use;
    void* free_list;
    
    Span(uint32_t pid, uint32_t pages, bool used = true) 
        : page_id(pid), num_pages(pages), in_use(used), free_list(nullptr) {}
};

class MemoryPool {
private:
    SimpleRadixTree<24> page_map_;  // 24位,支持16M頁,相當于64GB地址空間
    vector<Span*> spans_;  // 保存所有Span,用于清理
    
public:
    ~MemoryPool() {
        for(auto* span : spans_) {
            delete span;
        }
    }
    
    // 注冊內存塊
    void register_span(Span* span) {
        spans_.push_back(span);
        
        // 為這個Span的每一頁都建立映射
        for(uint32_t i = 0; i < span->num_pages; i++) {
            uint32_t page_id = span->page_id + i;
            page_map_.set(page_id, span);
        }
        
        cout << "注冊Span: 起始頁號=" << span->page_id 
             << ", 頁數=" << span->num_pages << endl;
    }
    
    // 根據地址快速找到所屬的內存塊
    Span* addr_to_span(void* ptr) {
        // 假設頁面大小為4KB,即PAGE_SHIFT=12
        uint32_t page_id = (reinterpret_cast<uintptr_t>(ptr) >> 12) & 0xFFFFFF;  // 取低24位
        returnreinterpret_cast<Span*>(page_map_.get(page_id));
    }
    
    // 根據頁號查找Span
    Span* page_to_span(uint32_t page_id) {
        returnreinterpret_cast<Span*>(page_map_.get(page_id));
    }
    
    // 釋放內存時,快速定位到對應的Span
    bool free_memory(void* ptr) {
        Span* span = addr_to_span(ptr);  // O(1)時間找到Span!
        if(span && span->in_use) {
            cout << "找到地址 " << ptr << " 對應的Span: 頁號" << span->page_id << endl;
            returntrue;
        }
        returnfalse;
    }

};

看到沒?有了基數樹,內存池的地址查找變成了O(1)操作,這對高并發場景下的內存分配性能提升是巨大的!

當然,這里只是簡單展示一下基數樹的應用思路。實際的內存池項目要復雜得多,想學習完整實現的同學不妨看看:三周肝出4000行代碼,我的內存池竟然讓malloc"破防"了!性能暴漲7.37倍背后的技術真相

什么時候該用基數樹?

基數樹雖然牛逼,但也不是萬能的。什么時候用呢?

適合用基數樹的場景:

  • 鍵的范圍相對固定且已知
  • 鍵分布比較密集
  • 對查找性能要求極高
  • 內存充足的環境

不適合用基數樹的場景:

  • 鍵的范圍非常大且分布稀疏
  • 內存嚴重受限的環境
  • 鍵是字符串等復雜類型

進階:多層基數樹

當鍵的范圍太大時(比如64位地址空間),1層基數樹就不夠用了。這時候我們可以用多層基數樹。

簡單來說,就是把一個超級大數組拆分成多個小數組的組合:

// 2層基數樹示意
template<int BITS = 36>  // 支持Linux 64位地址空間  
class PageMap2 {
private:
    // 位數分配:盡量均勻分配
    staticconstint LEAF_BITS = BITS / 2;        // 18位
    staticconstint ROOT_BITS = BITS - LEAF_BITS; // 18位
    staticconstsize_t ROOT_SIZE = 1ULL << ROOT_BITS; 
    staticconstsize_t LEAF_SIZE = 1ULL << LEAF_BITS;
    
    struct Leaf {
        void* values[LEAF_SIZE];
        
        Leaf() {
            memset(values, 0, sizeof(values));
        }
    };
    
    Leaf* root_[ROOT_SIZE];
    
public:
    PageMap2() {
        memset(root_, 0, sizeof(root_));
        cout << "二級基數樹初始化完成!" << endl;
        cout << "支持地址空間: " << (1ULL << BITS) << " 頁 ("
             << ((1ULL << BITS) * 4096) / (1024ULL*1024*1024*1024) << " TB)" << endl;
        cout << "固定內存開銷: " << sizeof(root_) / (1024*1024) << " MB" << endl;
    }
    
    ~PageMap2() {
        // 清理所有分配的葉子節點
        for(size_t i = 0; i < ROOT_SIZE; i++) {
            delete root_[i];
        }
    }
    
    // 獲取值 - 兩次數組訪問,仍然是O(1)!
    void* get(uint64_t key) {
        if(key >= (1ULL << BITS)) returnnullptr;
        
        uint64_t i1 = key >> LEAF_BITS;      // 高位作為一級索引
        uint64_t i2 = key & (LEAF_SIZE - 1); // 低位作為二級索引
        
        if(root_[i1] == nullptr) returnnullptr;
        return root_[i1]->values[i2];
    }
    
    // 設置值 - 按需分配葉子節點
    void set(uint64_t key, void* value) {
        if(key >= (1ULL << BITS)) return;
        
        uint64_t i1 = key >> LEAF_BITS;
        uint64_t i2 = key & (LEAF_SIZE - 1);
        
        // 按需分配葉子節點
        if(root_[i1] == nullptr) {
            root_[i1] = new Leaf();
            cout << "分配新的葉子節點: " << i1 << endl;
        }
        
        root_[i1]->values[i2] = value;
    }
};

這樣可以支持36位鍵空間(256TB地址),但內存是按需分配的,不會浪費。

在我最近帶領學員做的高性能內存池項目中,我們就采用了這種二級基數樹的設計思路,不過做了更多的工程優化。實際效果非常不錯,相比原來的unordered_map方案,性能提升了10倍以上。

感興趣的朋友可以看這篇文章:三周肝出4000行代碼,我的內存池竟然讓malloc"破防"了!性能暴漲7.37倍背后的技術真相

我的使用心得

用了基數樹這么久,我總結幾個心得:

  • 不要被"樹"這個名字迷惑了,基數樹本質上就是數組
  • 在高性能場景下,基數樹是神器,特別是內存池、路由表這些場景
  • 多層基數樹是進階版本,1層夠用就別搞復雜

編譯運行試試看

想要自己試試的同學,把文章中的代碼整合一下,用這個命令編譯:

g++ -std=c++11 -O2 radix_tree_test.cpp -o test
./test

在我的Ubuntu 20.04上跑得飛快!

寫在最后

基數樹真的是一個被低估的數據結構。

在合適的場景下,它能帶來數倍甚至數十倍的性能提升。Google、Facebook這些大廠的底層庫都在大量使用基數樹,絕對不是沒有道理的。

下次如果你遇到需要快速鍵值查找的場景,特別是鍵范圍相對固定的情況,不妨試試基數樹。說不定會有意想不到的驚喜!

責任編輯:趙寧寧 來源: 跟著小康學編程
相關推薦

2025-04-22 08:39:14

編程容器map

2021-06-02 22:54:34

技巧 Git Clone項目

2017-09-26 14:56:57

MongoDBLBS服務性能

2025-08-01 07:36:26

2025-03-13 11:59:00

2023-09-07 11:29:36

API開發

2025-10-10 05:56:11

2022-04-19 14:03:23

加密貨幣NFT安全

2022-03-19 23:20:57

加密貨幣安全信息泄漏

2025-06-05 04:22:00

SQL性能索引

2025-05-26 00:02:00

TypeScriptGo 語言前端

2021-09-13 10:25:35

開發技能代碼

2023-06-13 13:52:00

Java 7線程池

2009-12-15 21:49:05

2025-09-16 12:10:00

malloc內存池編程

2022-09-15 16:59:46

人工智能空調能源

2025-02-28 14:00:00

結構體C#.NET 9

2022-10-27 07:09:34

DjangoAPIRedis

2025-08-12 07:46:29

2024-07-17 08:25:44

點贊
收藏

51CTO技術棧公眾號

日本a√在线观看| 久久www免费人成精品| 久久久久亚洲av片无码| 一区二区三区视频播放| 黄色一区二区在线| 亚洲成色www久久网站| 精品久久人妻av中文字幕| 亚洲国产精品一区制服丝袜| 亚洲一区二区久久| 91人妻一区二区| 第四色男人最爱上成人网| 亚洲欧美激情小说另类| 欧美精品国产精品久久久| 国产三级伦理片| 久久精品二区三区| 久久综合网hezyo| 国产 欧美 在线| 91精品丝袜国产高跟在线| 色哟哟一区二区在线观看| 四虎精品欧美一区二区免费| 男人久久精品| 国产福利电影一区二区三区| 日本高清视频精品| 久久久综合久久久| 欧美激情偷拍自拍| 亚洲色图综合网| 亚洲欧美日韩偷拍| 日韩在线网址| 91精品婷婷国产综合久久性色| 无码人妻h动漫| 蜜桃传媒在线观看免费进入| 国产欧美日韩亚州综合| 久久久久高清| 免费a级片在线观看| 国产一区 二区 三区一级| 国产精品白嫩初高中害羞小美女| 久久精品美女视频| 午夜久久99| xx视频.9999.com| 久久久久久成人网| 九一成人免费视频| 亚洲精品自拍视频| 亚洲久久久久久| 粉嫩一区二区三区四区公司1| 欧美一区二区三区视频在线观看| 杨幂毛片午夜性生毛片| 成人小电影网站| 精品久久久久久久中文字幕| www.亚洲成人网| 四虎av在线| 一区二区三区四区中文字幕| 桥本有菜av在线| 精品孕妇一区二区三区| 综合亚洲深深色噜噜狠狠网站| 色姑娘综合av| 草草影院在线观看| 欧美激情在线一区二区三区| 婷婷四月色综合| av在线播放网站| 国产精品午夜春色av| 亚洲欧美日韩另类精品一区二区三区 | 国产美女久久久| 成人免费一区二区三区| 日本成人在线视频网站| 国产精品视频资源| 国产在成人精品线拍偷自揄拍| 精品一区二区三区在线观看国产| 成人免费视频网址| jizz中国女人| thepron国产精品| 欧美婷婷久久| 五月香视频在线观看| 亚洲人成在线观看一区二区| 色乱码一区二区三区熟女| 羞羞的视频在线观看| 亚洲丶国产丶欧美一区二区三区| 欧美精品一区免费| 日韩毛片一区| 欧美一卡二卡三卡| 真人bbbbbbbbb毛片| gogogo高清在线观看一区二区| 色av中文字幕一区| 国产午夜福利片| 久久久精品日韩| 91欧美精品午夜性色福利在线 | 国产福利精品一区二区| 精品无码久久久久国产| www.在线播放| 一区二区三区不卡视频| 国产成人无码av在线播放dvd| 久久久久久久性潮| 亚洲成人网av| 网爆门在线观看| 亚洲激情自拍| 国产中文字幕91| 婷婷婷国产在线视频| 一区精品在线播放| 欧美精品一区免费| 麻豆精品在线| 亚洲视频在线观看免费| 欧美极品视频在线观看| 日韩影院在线观看| 国产91色在线|亚洲| 不卡在线视频| 精品久久久久久久久国产字幕| 一本一道久久a久久综合蜜桃| 欧美激情15p| 欧美精品在线免费播放| 狠狠狠狠狠狠狠| 成人免费看视频| 亚洲高清资源综合久久精品| 国产亚av手机在线观看| 欧美日韩综合不卡| 人妻精品久久久久中文字幕| 婷婷综合久久| 国产精品高清免费在线观看| 欧日韩在线视频| 亚洲天堂福利av| 亚洲黄色av网址| 色爱综合av| 久久久视频精品| av网站免费播放| 国产精品久久久久桃色tv| 黄色高清无遮挡| 日韩高清影视在线观看| 午夜精品一区二区三区在线视频| 国产情侣激情自拍| 中文字幕制服丝袜成人av| 麻豆传传媒久久久爱| 日本午夜精品久久久| 成人激情视频网站| 欧美激情中文网| 国产又色又爽又黄又免费| 久久综合给合久久狠狠狠97色69| 免费超爽大片黄| 日韩精品免费视频一区二区三区| 中文字幕9999| 又骚又黄的视频| 国产欧美日韩精品在线| 久久久久国产精品熟女影院| 亚洲盗摄视频| 欧美亚洲激情在线| 日韩午夜影院| 日韩欧美精品免费在线| 免费中文字幕av| 亚洲永久字幕| 欧美精品二区三区四区免费看视频 | 黑人糟蹋人妻hd中文字幕 | 日韩欧美亚洲区| 色8久久影院午夜场| 亚洲欧美综合另类中字| 69亚洲精品久久久蜜桃小说| 久久久影院官网| 欧美视频免费播放| 欧美精品一区二区三区中文字幕| 国产成人综合一区二区三区| 成年人在线免费观看| 欧美午夜一区二区三区| 熟女av一区二区| 国产精品综合二区| 日韩精品视频在线观看视频| 都市激情久久| 日本高清视频精品| 在线观看完整版免费| 日韩午夜激情av| 日本少妇性生活| 久久毛片高清国产| 日韩高清第一页| 欧美一区二区三区久久精品| 国产精品久久久久久久久婷婷| h片在线观看| 亚洲人成免费电影| 97精品久久人人爽人人爽| 亚洲久草在线视频| 国产精品手机在线观看| 久久中文在线| 色中文字幕在线观看| 超碰精品在线| 国产精品电影观看| 亚洲丝袜一区| 亚洲精品一区二区三区不| 亚洲网站免费观看| 亚洲一区在线视频观看| 三上悠亚影音先锋| 狠狠狠色丁香婷婷综合激情| 欧美精品自拍视频| 日韩系列欧美系列| 国产高清精品一区二区三区| 在线亚洲人成| 久久国产精品久久久久| 亚洲人妻一区二区| 欧美精品一二三四| 日韩高清精品免费观看| 日本一区二区三区视频视频| 丰满人妻一区二区三区53视频| 国产视频一区在线观看一区免费| 午夜欧美性电影| 给我免费播放日韩视频| 国产精品久久久久久久久久久久久| av网站大全在线| 亚洲一区二区精品| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 | 欧产日产国产69| 亚洲三级电影全部在线观看高清| 中文字幕免费在线播放| 狠狠狠色丁香婷婷综合激情| 国产成人av影视| 狠狠久久婷婷| 伊人久久大香线蕉精品 | 精品国产无码在线| 亚洲成在人线免费观看| 波多野结衣久草一区| 宅男噜噜噜66国产精品免费| 琪琪亚洲精品午夜在线| 不卡av免费观看| 免费不卡在线观看av| 最新国产在线观看| 亚洲精品一区中文字幕乱码| 欧美少妇bbw| 日韩写真欧美这视频| 亚洲无码精品国产| 91精品福利在线| 午夜精品久久久久久久久久久久久蜜桃 | 欧美日韩一区 二区 三区 久久精品| 国产一级aa大片毛片| 亚洲欧美日韩国产另类专区 | 青草久久伊人| 亚洲成人免费网站| www.亚洲欧美| 欧美一区二区三区电影| 91国在线视频| 欧美日韩视频不卡| 在线观看你懂的网站| 色网综合在线观看| 人妻丰满熟妇av无码区| 欧美日韩免费网站| 毛片基地在线观看| 激情亚洲一区二区三区四区 | 影音先锋在线播放| 久久久91精品| caopon在线免费视频| 久久影院中文字幕| 午夜激情在线| 欧美高清在线播放| 成人性生交大片免费看网站 | 99热这里有精品| 国产在线观看一区二区三区| 国产在视频一区二区三区吞精| 国产精品亚洲网站| **国产精品| 97se视频在线观看| 国产精品极品| 久久综合色一本| 国产乱码精品一区二区三区四区| 欧美日韩一区二区三区在线观看免 | 日本不卡高清视频| 久久久久xxxx| 国产精品一区二区黑丝| 日本一区二区免费视频| av在线不卡免费看| 欧美做受喷浆在线观看| 久久日韩粉嫩一区二区三区| xxxx日本黄色| 亚洲色图视频网| 国产小视频在线观看免费| 五月激情综合色| 无码人妻久久一区二区三区不卡| 欧美影视一区二区三区| 国产露脸无套对白在线播放| 日韩情涩欧美日韩视频| 午夜黄色小视频| 在线亚洲男人天堂| av在线免费网址| 国外成人性视频| 亚洲精品在线影院| 亚洲最大成人在线| 校园春色另类视频| 在线丝袜欧美日韩制服| 伊人久久婷婷| www.日本xxxx| 成人污视频在线观看| www.av欧美| 亚洲精品网站在线观看| 在线观看免费国产视频| 欧美专区在线观看一区| 精品黑人一区二区三区在线观看| 日韩极品精品视频免费观看| 99riav在线| 欧美精品第一页在线播放| 国产高清不卡| 99在线视频首页| 精品一区二区三| 波多野结衣av一区二区全免费观看| 新狼窝色av性久久久久久| 九一精品久久久| 26uuu亚洲| 尤物在线免费视频| 欧美性猛交xxx| 性生交生活影碟片| 永久免费看mv网站入口亚洲| 国产网红在线观看| 国产美女直播视频一区| 亚洲系列另类av| 大胆欧美熟妇xx| 久久国产精品99久久人人澡| 国产成人无码一区二区在线观看| 亚洲欧美日韩国产手机在线| 无码日韩精品一区二区| 亚洲精品一区二区在线观看| 2021av在线| 日本中文字幕成人| 国内毛片久久| 一级性生活视频| 麻豆精品国产91久久久久久| 中文字字幕码一二三区| 亚洲网友自拍偷拍| 国产免费黄色网址| 日日摸夜夜添一区| 日韩三区免费| 欧美成人第一区| 中文日韩在线| www男人天堂| 亚洲最色的网站| 国产wwwwwww| 大胆人体色综合| 精品国产黄a∨片高清在线| 欧美日韩免费高清| 亚洲影音先锋| 亚洲av综合一区二区| 天天影视涩香欲综合网| 乱精品一区字幕二区| 九九热这里只有精品6| 国产激情精品一区二区三区| 亚洲春色在线视频| 日本人妖一区二区| 成人无码av片在线观看| 日本韩国精品在线| 你懂的视频在线| 热久久免费视频精品| 免费成人网www| www日韩视频| 久久久99久久精品欧美| 日韩免费av网站| 亚洲色无码播放| 久久福利在线| 一级特黄录像免费播放全99| 另类的小说在线视频另类成人小视频在线| 美女久久久久久久久久| 色天天综合久久久久综合片| 九色在线免费| 国产精品久久久久久久一区探花| 精品在线播放| 美女网站色免费| 国产精品短视频| 成人av一区二区三区在线观看| 欧美成人一区二区三区电影| 6080亚洲理论片在线观看| 天堂8在线天堂资源bt| 91视视频在线观看入口直接观看www | 国产一级淫片a| 亚洲精品国产精品久久清纯直播 | 欧美绝品在线观看成人午夜影视| 日本中文字幕在线播放| 91手机在线播放| 9国产精品视频| 国产一级久久久久毛片精品| 欧美色精品在线视频| 麻豆网站在线看| 国产不卡一区二区在线观看| 亚洲作爱视频| 永久免费毛片在线观看| 在线播放日韩导航| 免费不卡av| 日本一区二区在线| 国产美女一区二区| www.中文字幕在线观看| 色综合伊人色综合网| 亚洲国产aⅴ精品一区二区| 干日本少妇首页| 国产精品电影一区二区| 日本wwwxxxx| 国产精品一区二区三区在线播放 | 亚洲国产一区视频| 久热av在线| 亚洲自拍av在线| 男女精品网站| 欧美日韩一级在线观看| 亚洲免费精彩视频| 国产999精品在线观看| 日韩免费一级视频| 亚洲天堂福利av| 免费黄色片在线观看| 97欧洲一区二区精品免费| 亚洲一区二区成人| 青青草偷拍视频| 国产亚洲欧美aaaa| 国产精品极品在线观看| 日韩不卡一二三| 欧美午夜影院在线视频| 在线观看av免费|