国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

如何更快地將string轉(zhuǎn)換成int/long

共 13566字,需瀏覽 28分鐘

 ·

2021-09-13 18:16

作者 | Kirito的技術(shù)分享

來源 | https://mp.weixin.qq.com/s/5qQg3ef8yjVG089iqoNTaw

你好鴨,Kirito 今天又來分享性能優(yōu)化的騷操作了。

在很多追求性能的程序挑戰(zhàn)賽中,經(jīng)常會遇到一個(gè)操作:將 String 轉(zhuǎn)換成 Integer/Long。如果你沒有開發(fā)過高并發(fā)的系統(tǒng),或者沒有參加過任何性能挑戰(zhàn)賽,可能會有這樣的疑問:這有啥好講究的,Integer.valueOf/Long.valueOf 又不是不能用。實(shí)際上,很多內(nèi)置的轉(zhuǎn)換工具類只滿足了功能性的需求,在高并發(fā)場景下,可能會是熱點(diǎn)方法,成為系統(tǒng)性能的瓶頸。

文章開頭,我先做一下說明,本文的測試結(jié)論出自:https://kholdstare.github.io/technical/2020/05/26/faster-integer-parsing.html 。測試代碼基于 C++,我會在翻譯原文的同時(shí),添加了部分自己的理解,以協(xié)助讀者更好地理解其中的細(xì)節(jié)。

問題提出

假設(shè)現(xiàn)在有一些文本信息,固定長度為 16 位,例如下文給出的時(shí)間戳,需要盡可能快地解析這些時(shí)間戳

timestamp
1585201087123567
1585201087123585
1585201087123621

方法體如下所示:

std::uint64_t parse_timestamp(std::string_view s)
{
  // ???
}

問題提出后,大家不妨先思考下,如果是你,你會采取什么方案呢?帶著這樣的思考,我們進(jìn)入下面的一個(gè)個(gè)方案。

Native 方案

我們有哪些現(xiàn)成的轉(zhuǎn)換方案呢?

  • 繼承自 C 的 std::atoll
  • std::stringstream
  • C++17 提供的 charconv
  • boost::spirit::qi
  • 如果您正在學(xué)習(xí)Spring Boot,推薦一個(gè)連載多年還在繼續(xù)更新的免費(fèi)教程:http://blog.didispace.com/spring-boot-learning-2x/

評測程序采用 Google Benchmark 進(jìn)行對比評測。同時(shí),我們以不做任何轉(zhuǎn)換的方案來充當(dāng) baseline,以供對比。(baseline 方案在底層,相當(dāng)于將數(shù)值放進(jìn)來了寄存器中,所以命名成了 BM_mov)

下面給出的評測代碼不是那么地關(guān)鍵,只是為了給大家展示評測是如何運(yùn)行的。

static void BM_mov(benchmark::State& state) {
  for (auto _ : state) {
    benchmark::DoNotOptimize(1585201087123789);
  }
}

static void BM_atoll(benchmark::State& state) {
  for (auto _ : state) {
    benchmark::DoNotOptimize(std::atoll(example_timestamp));
  }
}

static void BM_sstream(benchmark::State& state) {
  std::stringstream s(example_timestamp);
  for (auto _ : state) {
    s.seekg(0);
    std::uint64_t i = 0;
    s >> i;
    benchmark::DoNotOptimize(i);
  }
}
static void BM_charconv(benchmark::State& state) {
  auto s = example_timestamp;
  for (auto _ : state) {
    std::uint64_t result = 0;
    std::from_chars(s.data(), s.data() + s.size(), result);
    benchmark::DoNotOptimize(result);
  }
}

static void BM_boost_spirit(benchmark::State& state) {
  using boost::spirit::qi::parse;
  for (auto _ : state) {
    std::uint64_t result = 0;
    parse(s.data(), s.data() + s.size(), result);
    benchmark::DoNotOptimize(result);
  }
}

Native

可以發(fā)現(xiàn) stringstream 表現(xiàn)的非常差。當(dāng)然,這并不是一個(gè)公平的比較,但從測評結(jié)果來看,使用 stringstream 來實(shí)現(xiàn)數(shù)值轉(zhuǎn)換相比 baseline 慢了 391 倍。相比之下, <charconv> 和 boost::spirit 表現(xiàn)的更好。

既然我們已經(jīng)知道了目標(biāo)字符串包含了要解析的數(shù)字,而且不需要做任何的數(shù)值校驗(yàn),基于這些前提,我們可以思考下,還有更快的方案嗎?

如果您正在學(xué)習(xí)Spring Boot,推薦一個(gè)連載多年還在繼續(xù)更新的免費(fèi)教程:http://blog.didispace.com/spring-boot-learning-2x/

Naive 方案

我們可以通過一個(gè)再簡單不過的循環(huán)方案,一個(gè)個(gè)地解析字符。

inline std::uint64_t parse_naive(std::string_view s) noexcept
{
  std::uint64_t result = 0;
  for(char digit : s)
  {
    result *= 10;
    result += digit - '0';
  }
  return result;
}

Naive

雖然這層 for 循環(huán)看起來呆呆的,但如果這樣一個(gè)呆呆的解決方案能夠擊敗標(biāo)準(zhǔn)庫實(shí)現(xiàn),何樂而不為呢?前提是,標(biāo)準(zhǔn)庫的實(shí)現(xiàn)考慮了異常場景,做了一些校驗(yàn),這種 for 循環(huán)寫法的一個(gè)前提是,我們的輸入一定是合理的。

之前我的文章也提到過這個(gè)方案。顯然, naive 的方案之后還會有更優(yōu)的替代方案。

循環(huán)展開方案

記得我們在文章的開頭加了一個(gè)限定,限定了字符串長度固定是 16 位,所以循環(huán)是可以被省略的,循環(huán)展開之后,方案可以更快。

inline std::uint64_t parse_unrolled(std::string_view s) noexcept
{
  std::uint64_t result = 0;

  result += (s[0] - '0') * 1000000000000000ULL;
  result += (s[1] - '0') * 100000000000000ULL;
  result += (s[2] - '0') * 10000000000000ULL;
  result += (s[3] - '0') * 1000000000000ULL;
  result += (s[4] - '0') * 100000000000ULL;
  result += (s[5] - '0') * 10000000000ULL;
  result += (s[6] - '0') * 1000000000ULL;
  result += (s[7] - '0') * 100000000ULL;
  result += (s[8] - '0') * 10000000ULL;
  result += (s[9] - '0') * 1000000ULL;
  result += (s[10] - '0') * 100000ULL;
  result += (s[11] - '0') * 10000ULL;
  result += (s[12] - '0') * 1000ULL;
  result += (s[13] - '0') * 100ULL;
  result += (s[14] - '0') * 10ULL;
  result += (s[15] - '0');

  return result;
}

unrolled

關(guān)于循環(huán)展開為什么會更快,可以參考我過去關(guān)于 JMH 的文章。

byteswap 方案

先思考下,如果繼續(xù)圍繞上述的方案進(jìn)行,我們可能只有兩個(gè)方向:

  1. 并發(fā)執(zhí)行加法和乘法計(jì)算,但這種 CPU 操作似乎又不能通過多線程之類的手段進(jìn)行加速,該如何優(yōu)化是個(gè)問題
  2. 將乘法和加法運(yùn)算轉(zhuǎn)換成位運(yùn)算,獲得更快的 CPU 執(zhí)行速度,但如果轉(zhuǎn)換又是個(gè)問題

相信讀者們都會有這樣的疑問,那我們繼續(xù)帶著這樣疑問往下看原作者的優(yōu)化思路是什么。

如果您正在學(xué)習(xí)Spring Boot,推薦一個(gè)連載多年還在繼續(xù)更新的免費(fèi)教程:http://blog.didispace.com/spring-boot-learning-2x/

緊接著上述的循環(huán)展開方案,將 “1234” 解析為 32 位整數(shù)對應(yīng)的循環(huán)展開操作繪制為圖,過程如下:

Unrolled solution graph

我們可以看到,乘法和加法的操作次數(shù)跟字符的數(shù)量是線性相關(guān)的。由于每一次乘法都是由不同的乘數(shù)進(jìn)行,所以我們不能只乘“一次”,在乘法的最后,我們還需要將所有結(jié)果相加。乍一看,好像很難優(yōu)化。

下面的優(yōu)化技巧,需要一些操作系統(tǒng)、編譯原理相關(guān)的知識作為輔助,你需要了解 byteswap 這個(gè)系統(tǒng)調(diào)用,了解大端序和小端序的字節(jié)序表示方法(后面我也會分享相關(guān)的文章),如果你不關(guān)心這些細(xì)節(jié),也可以直接跳到本段的最后,直接看結(jié)論。

理解清楚下圖的含義,需要理解幾個(gè)概念:

  • 字符 1 對應(yīng)的 ascii 值是 31,相應(yīng)的 2 對應(yīng) 32,4 對應(yīng) 34
  • 在小端序機(jī)器上(例如 x86),字符串是以大端序存儲的,而 Integer 是以小端序存儲的
  • byteswap 可以實(shí)現(xiàn)字節(jié)序調(diào)換

byteswap

上圖展示了十六進(jìn)制表示下的轉(zhuǎn)換過程,可以在更少的操作下達(dá)到最終的解析狀態(tài)。

將上圖的流程使用 C++ 來實(shí)現(xiàn),將 String 重新解釋為 Integer,必須使用 std::memcpy(避免命名沖突),執(zhí)行相減操作,然后通過編譯器內(nèi)置的 __builtin_bswap64 在一條指令中交換字節(jié)。到目前為止,這是最快的一個(gè)優(yōu)化。

template <typename T>
inline T get_zeros_string() noexcept;

template <>
inline std::uint64_t get_zeros_string<std::uint64_t>() noexcept
{
  std::uint64_t result = 0;
  constexpr char zeros[] = "00000000";
  std::memcpy(&result, zeros, sizeof(result));
  return result;
}

inline std::uint64_t parse_8_chars(const char* string) noexcept
{
  std::uint64_t chunk = 0;
  std::memcpy(&chunk, string, sizeof(chunk));
  chunk = __builtin_bswap64(chunk - get_zeros_string<std::uint64_t>());

  // ...
}

我們看上去得到了想要的結(jié)果,但是這個(gè)方案從時(shí)間復(fù)雜度來看,仍然是 O(n) 的,是否可以在這個(gè)方案的基礎(chǔ)上,繼續(xù)進(jìn)行優(yōu)化呢?

分治方案

從最初的 Native 方案,到上一節(jié)的 byteswap 方案,我們都只是優(yōu)化了 CPU 操作,并沒有優(yōu)化復(fù)雜度,既然不滿足于 O(n),那下一個(gè)復(fù)雜度可能性是什么?O(logn)!我們可以將每個(gè)相鄰的數(shù)字組合成一對,然后將每對數(shù)字繼續(xù)組合成一組四個(gè),依此類推,直到我們得到整個(gè)整數(shù)。

如何同時(shí)處理鄰近的數(shù)字,這是讓算法跑進(jìn) O(logn) 的關(guān)鍵

該方案的關(guān)鍵之處在于:將偶數(shù)位的數(shù)字乘以 10 的冪,并且單獨(dú)留下奇數(shù)位的數(shù)字。這可以通過位掩碼(bitmasking)來實(shí)現(xiàn)

分治方案

通過 bitmasking,我們可以一次對多個(gè)數(shù)字進(jìn)行操作,將它們組合成一個(gè)更大的組合

通過使用這個(gè)掩碼技巧來實(shí)現(xiàn)前文提到的 parse_8_chars 函數(shù)。使用 bitmasking 的另一好處在于,我們不用減去 '0' ,因?yàn)槲谎诖a的副作用,使得我們正好可以省略這一步。

inline std::uint64_t parse_8_chars(const char* string) noexcept
{
  std::uint64_t chunk = 0;
  std::memcpy(&chunk, string, sizeof(chunk));

  // 1-byte mask trick (works on 4 pairs of single digits)
  std::uint64_t lower_digits = (chunk & 0x0f000f000f000f00) >> 8;
  std::uint64_t upper_digits = (chunk & 0x000f000f000f000f) * 10;
  chunk = lower_digits + upper_digits;

  // 2-byte mask trick (works on 2 pairs of two digits)
  lower_digits = (chunk & 0x00ff000000ff0000) >> 16;
  upper_digits = (chunk & 0x000000ff000000ff) * 100;
  chunk = lower_digits + upper_digits;

  // 4-byte mask trick (works on pair of four digits)
  lower_digits = (chunk & 0x0000ffff00000000) >> 32;
  upper_digits = (chunk & 0x000000000000ffff) * 10000;
  chunk = lower_digits + upper_digits;

  return chunk;
}

trick 方案

綜合前面兩節(jié),解析 16 位的數(shù)字,我們將它分成兩個(gè) 8 字節(jié)的塊,運(yùn)行剛剛編寫的 parse_8_chars,并對其進(jìn)行基準(zhǔn)測試!

inline std::uint64_t parse_trick(std::string_view s) noexcept
{
  std::uint64_t upper_digits = parse_8_chars(s.data());
  std::uint64_t lower_digits = parse_8_chars(s.data() + 8);
  return upper_digits * 100000000 + lower_digits;
}

static void BM_trick(benchmark::State& state) {
  for (auto _ : state) {
    benchmark::DoNotOptimize(parse_trick(example_stringview));
  }
}

trick

看上去優(yōu)化的不錯(cuò),我們將循環(huán)展開方案的基準(zhǔn)測試優(yōu)化了近 56% 的性能。能做到這一點(diǎn),主要得益于我們手動進(jìn)行一系列 CPU 優(yōu)化的操作,雖然這些并不是特別通用的技巧。這樣算不算開了個(gè)不好的頭呢?我們看起來對 CPU 操作干預(yù)地太多了,或許我們應(yīng)該放棄這些優(yōu)化,讓 CPU 自由地飛翔。

SIMD trick 方案

你是不是以為上面已經(jīng)是最終方案了呢?不,優(yōu)化還剩最后一步。

我們已經(jīng)得到了一個(gè)結(jié)論

  • 同時(shí)組合多組數(shù)字以實(shí)現(xiàn) O(logn) 復(fù)雜度

如果有 16 個(gè)字符或 128 位的字符串要解析,還可以使用 SIMD。感興趣的讀者可以參考SIMD stands for Single Instruction Multiple Data。Intel 和 AMD CPU 都支持 SSE 和 AVX 指令,并且它們通常使用更寬的寄存器。

SIMA 簡單來說就是一組 CPU 的擴(kuò)展指令,可以通過調(diào)用多組寄存器實(shí)現(xiàn)并行的乘法運(yùn)算,從而提升系統(tǒng)性能。我們一般提到的向量化運(yùn)算就是 SIMA。

讓我們先設(shè)置 16 個(gè)字節(jié)中的每一個(gè)數(shù)字:

inline std::uint64_t parse_16_chars(const char* string) noexcept
{
  auto chunk = _mm_lddqu_si128(
    reinterpret_cast<const __m128i*>(string)
  );
  auto zeros =  _mm_set1_epi8('0');
  chunk = chunk - zeros;
  
  // ...
}

現(xiàn)在,主角變成了 madd 該系統(tǒng)調(diào)用。這些 SIMD 函數(shù)與我們使用位掩碼技巧所做的操作完全一樣——它們采用同一個(gè)寬寄存器,將其解釋為一個(gè)由較小整數(shù)組成的向量,每個(gè)乘以一個(gè)特定的乘數(shù),然后將相鄰位的結(jié)果相加到一個(gè)更寬的整數(shù)向量中。所有操作一步完成。

// The 1-byte "trick" in one instruction
const auto mult = _mm_set_epi8(
  110110110110110110110110
);
chunk = _mm_maddubs_epi16(chunk, mult);

2 字節(jié)方案其實(shí)還有另一條指令,但不幸的是我并沒有找到 4 字節(jié)方案的指令,還是需要兩條指令。這是完整的 parse_16_chars 方案:

inline std::uint64_t parse_16_chars(const char* string) noexcept
{
  auto chunk = _mm_lddqu_si128(
    reinterpret_cast<const __m128i*>(string)
  );
  auto zeros =  _mm_set1_epi8('0');
  chunk = chunk - zeros;

  {
    const auto mult = _mm_set_epi8(
      110110110110110110110110
    );
    chunk = _mm_maddubs_epi16(chunk, mult);
  }
  {
    const auto mult = _mm_set_epi16(1100110011001100);
    chunk = _mm_madd_epi16(chunk, mult);
  }
  {
    chunk = _mm_packus_epi32(chunk, chunk);
    const auto mult = _mm_set_epi16(0000110000110000);
    chunk = _mm_madd_epi16(chunk, mult);
  }

  return ((chunk[0] & 0xffffffff) * 100000000) + (chunk[0] >> 32);
}

SIMD trick

0.75 nanoseconds! 是不是大吃一驚呢.

總結(jié)

整體對比

有人可能會問,你為啥要用 C++ 來介紹下,不能用 Java 嗎?我再補(bǔ)充下,本文的測試結(jié)論,均來自于老外的文章,文章出處見開頭,其次,本文的后半部分的優(yōu)化,都是基于一些系統(tǒng)調(diào)用,和 CPU 指令的優(yōu)化,這些在 C++ 中實(shí)現(xiàn)起來方便一些,Java 只能走系統(tǒng)調(diào)用。

在最近過去的性能挑戰(zhàn)賽中,由于限定了不能使用 JNI,使得選手們只能將方案止步于循環(huán)展開方案,試想一下,如果允許走系統(tǒng)調(diào)用,加上比賽中字符串也基本是固定的長度,完全可以采用 SIMD 的 trick 方案,String 轉(zhuǎn) Long 的速度會更快。

polardb優(yōu)化點(diǎn)

實(shí)際上,在之前 polarDB 的比賽中,普哥就給我介紹過 bswap 的向量化方案,這也是為啥 Java 方案就是比 C++ 方案遜色的原因之一,C++ 在執(zhí)行一些 CPU 指令集以及系統(tǒng)調(diào)用上,比 Java 方便很多。

如何看待這一系列的優(yōu)化呢?從 std::stringstream 的 86.23 到 sima trick 方案的 0.75,這個(gè)優(yōu)化的過程是令人興奮的,但我們也發(fā)現(xiàn),越往后,越是用到一些底層的優(yōu)化技巧,正如方案中的 trick 而言,適用性是有限的。也有一種聲音是在說:花費(fèi)這么大精力去優(yōu)化,為啥不去寫匯編呢?這又回到了“優(yōu)化是萬惡之源”這個(gè)話題。在業(yè)務(wù)項(xiàng)目中,可能你不用過多關(guān)注 String 是如何轉(zhuǎn)換為 Long 和 Integer 的,可能 Integer.valueOf 和 Long.valueOf 就可以滿足你的訴求,但如果你是一個(gè)需要大數(shù)據(jù)解析系統(tǒng),String 轉(zhuǎn)換是系統(tǒng)的瓶頸之一,相信本文的方案會給你一定的啟發(fā)。

另外對于 SIMD 這些方案,我想再多說一句。其實(shí)一些性能挑戰(zhàn)賽進(jìn)行到最后,大家的整體方案其實(shí)都相差無幾,無非是參數(shù)差異,因?yàn)楸荣悎鼍巴ǔ2粫珡?fù)雜,最后前幾名的差距,就是在一些非常小的細(xì)節(jié)上。正如 SIMA 提供的向量化運(yùn)算等優(yōu)化技巧,它就是可以幫助你比其他人快個(gè)幾百毫秒,甚至 1~2s。這時(shí)候你會感嘆,原來我跟大神的差距,就是在這些細(xì)節(jié)上。但反觀整個(gè)過程,似乎這些優(yōu)化并不能幫助程序設(shè)計(jì)競賽發(fā)揮更大的能量,一個(gè)比賽如果只能依靠 CPU 優(yōu)化來實(shí)現(xiàn)區(qū)分度,我覺得一定不是成功的。所以,對于主辦方而言,禁用掉一些類庫,其實(shí)有效的避免了內(nèi)卷,于參賽者而言,算是一種減負(fù)了。希望以后的比賽也都朝著讓選手花更多精力去優(yōu)化方案,而不是優(yōu)化通用的細(xì)節(jié)上。

再回到 String 解析成 Long/Integer 的話題上。在實(shí)際使用時(shí),大家也不用避諱繼續(xù)使用 Integer.valueOf 或者 Long.valueOf,大多數(shù)情況下,這不是系統(tǒng)的瓶頸。而如果你恰好在某些場景下遇到了 String 轉(zhuǎn)換的瓶頸,希望本文能夠幫到你。

- END -

往期推薦

OAuth2 服務(wù)器Keycloak中的Realm

Java 17 將至,可能帶來哪些新特性呢?

機(jī)械妖姬上門要源碼后續(xù)結(jié)果來了!

重磅消息:Spring 6 和Spring Boot 3

短信驗(yàn)證碼登錄流程思路及詳細(xì)步驟



喜歡本文歡迎轉(zhuǎn)發(fā),關(guān)注我訂閱更多精彩

關(guān)注我回復(fù)「加群」,加入Spring技術(shù)交流群

瀏覽 51
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日韩人妻一区二区| 成人欧美一区二区三区在线观看| 欧美色色色网| 丁香婷婷色五月| 超碰操逼| 亚洲无码精品一区二区| 97人人色| 在线视频污| 久9久9久9久9久9久9| 中文乱码在线观看| 成人av小说网站| 成人久久| 久操AV| 色婷婷在线视频观看| 国产在线免费视频| 日韩在线看片| 欧美A级成人婬片免费看| 91丨熟女丨露脸| 欧美成人一区二区三区片| 亚洲欧美综合| 黄片www| 日韩色情片| 国产一区二区三区免费视频| 国产一级a毛一级a做免费图片 | 乱子伦国产精品视频一级毛 | 内射一区二区| 大香蕉美女视频| 亚洲性夜夜天天天天天天| 欧美视频一区二区三区| 国产精品内射婷婷一级二| 亚洲在线无码视频| 91人人妻人人澡人人爽| 狠狠无码| 无码在线不卡| 国产TS变态重口人妖| 高清中文字幕在线A片| 黄色三级A片| 动漫操逼视频| 爱爱免费视频| 天天干天天上| 久草新| 国产精品秘久久久久久网站| 一级性爱视频| 香蕉福利视频| 久久爆乳一区二区三区| 五月婷婷中文| 在线免费观看AV片| 69国产精品| 国产精品欧美一区二区三区苍井空 | 在线观看黄色网页| 在线播放亚洲| 日本一级特级毛片视频| 亚洲黄色在线免费观看| 久草电影网站| 内射视频免费看| 精品成人Av一区二区三区| 丁香花在线小说免费阅读| 久草新| 欧美性爱香蕉视频| 久久中文字幕电影| 亚洲高清国产欧美综合s8| 亚洲中文字幕久久日| 欧美日韩高清| 伊人97| 在线播放亚洲| 日韩av在线免费观看| 91麻豆成人| 91玖玖| 国产一级婬片A片| 欧美成人精品一区二区三区| 中国熟妇XXXX18| 中文字幕第83页| 熟女人妻人妻HD| 黄色视频视频| 亚洲黄色免费网站| 日本无码在线播放| 欧美成人猛片AAAAAAA| 久久99综合| A级无码| 国产久久这里只有精品视频| 亚洲无码电影网| 国产精品成人无码免费| 91人妻无码一区二区三区| 丁香五月在线视频| 玖玖在线| 三级视频在线观看| 38D蜜桃臀| 999reav| 激情一一区二区三区| 亚洲秘AV无码一区二区qq群| 亚洲性爱片| AV青草| 操b国产| 欧美日韩亚洲一区二区三区| 中国熟睡妇BBwBBw| 中文资源在线a| 江苏妇搡BBBB搡BBBB-百度| 亚洲成年人在线| www.xxx国产| 国产精品久久久久久久9999| 人妻啪啪视频| 一级特黄录像免费播放下载软件| 簧片在线免费观看| 中文无码一区二区三区| 亚洲AV成人精品一区二区三区| 国产深夜福利| 人妻综合网| 内射学生妹| 乱伦自拍| 日本成人不卡视频| 亚洲精品一线| 黄色视频在线观看大全| 少妇做爱特级AAA| 亚洲ww国产a大作| 伊人大香蕉综合| 69成人导航| 久久久久久久久国产| 中国熟女HD| 亚洲精品国产精品乱码不卡√香蕉| 3D精品啪啪一区二区免费| 亚洲国产精品尤物yw在线观看 | 国产黄色免费| 最新中文字幕视频| 日韩wuma| 97超碰资源站| 欧美性BBB槡BBB槡BBB| 日本精品无码a62v在线| 91豆花视频| 久久久久久久人妻丝袜| a三级片| 日韩乱伦网站| 中文字幕在线视频第一页| 3344在线观看免费下载视频| 学生妹做爱视频| 久草视频免费在线观看| 欧美日韩精品一区二区三区| 中文字幕北条麻妃| 91在线永久| 日本特黄AA片免费视频| 好吊看视频| 日本一区二区三区在线观看| 仙踪林777777野大粗| 嘿嘿午夜影院| 中文字幕第11页| 日韩欧美123| 日本中文字幕电影| 日韩性爱视频| 久久婷婷热| 国产熟女av| 日本特黄AA片免费视频| 无码av在线播放| 国产中文字幕亚洲综合欧美| 丰满的人妻一区二区10| 尤物视频在线观看视频| 69婷婷国产精品| 久久久亚洲| 不迷路福利视频| 日本成人免费电影| 国产精品扒开腿做爽爽爽视频| 天天色影院| 国产青青| 伊人婷婷色香综合| 91大神精品| 成人美女视频| 91精品国产三级| 亚洲色图图片| 在线观看三级网址| 人人射人人射| 一区二区三区四区免费看| 91免费视频观看| 国产一区二区三区在线| 大逼影院| 青草一区| 久久99嫩草熟妇人妻蜜臀| 五月婷婷欧美| 人人爱人人爽人人操| 第一福利导航大全| 老婆中文字幕乱码中文乱码| 懂色aV| 国产成人精品a视频| 亚洲猛男操逼欧美国产视频| 黄色一级在线| 欧美国产在线观看| 欧美午夜黄片| 天天躁日日躁狠狠| 中文字幕777| 成人精品无码免费视频| 男女www| 高清无码在线看| 视色网| 亚洲成人自拍| 亚洲伦理一区二区| 激情五月天小说网| 久久老女人| 一级黄色毛片视频| 天天天天天天干| 中文字幕自拍偷拍| 91干干| 婷婷五月情| 天堂A片电影网站在线观看| 亚洲AV无码成人精品区www| 先锋资源在线视频| 亚洲激情网| 欧美精品无码一区二区| 国产乱子伦无码视频免费| 日韩操逼网站| 色悠悠久久| 韩国一级AV| 中文字幕15页| 97超碰碰| 亚洲视频精选| 911国产精品| 操碰97| 久草a视频| www污| 国产h视频在线观看| 日本视频网| 中文在线A∨在线| 97自拍| 色婷婷在线播放| 波多野结衣无码AV专区| 国产色视频一区二区三区QQ号| 国产福利av| 伊人三级网| 亚洲欧美日韩激情| 69毛片| 97免费在线视频| 国产一级麻豆| 人人操网| 日韩无码乱码| 神马影院午夜福利| 日韩毛片在线| 欧美99视频| 高潮国产视频| 国产精品视频在线观看| 久久国产精品电影| 日韩v在线| 日本天堂Tv视频在线观看| 爱爱视频免费网站| 午夜乱伦福利| 久久精品成人| 亚洲中文字幕久久日| 国产一区二区在线播放| 91精品久久久久久久久| 婷婷久久五月天| 性性性性性XXXXX| 中文字幕一区二区三区日本在线| 免费无码国产在线观看快色| 先锋久久资源| 国产无码黄片| 人人艹人人摸| 亚洲中文字幕免费观看视频| 午夜福利视频91| 狠久久| 人人操人人干人人妻| 亚洲乱码中文字幕| 欧亚毛片| 亚洲成人视频网| 亚洲黄色视频在线| 青青在线| 红桃91人妻爽人妻爽| 色视频在线| 骚小姨子无码| 九色PORNY丨自拍蝌蚪| 国产精品久久久久久久久久久久久久 | 欧美日韩精品在线| 综合久久久久| 特级艺体西西444WWw| 欧美操逼图| 亚洲乱伦av| 国产h视频| 一区二区三区四区五区六区高清无吗视频| 撸一撸免费视频| 91网址| 成人色播播| 欧美成人无码一区二区三区| 日韩免费无码| 亚洲精品乱码在线| 中文无码播放| 国产欧美一区在线看| 亚洲最大网站| 五月精品| 成人在线视频一区| 嫰BBB槡BBBB槡BBBB| 国产A级毛片| 荫蒂添到高潮免费视频| 在线免费观看黄色电影| 五月天婷婷色播| 五月天婷婷久久| 免费国产视频| 韩国无码视频在线观看| 人人妻人人爽人人精品| 黄色一级在线| 骚熟妇| 久久久久久久久久国产精品免费观看-百度 | 伊人婷婷大香蕉| 性爱视频网站| 国产超级无码高清在线视频观看| 国产亚洲日韩在线| 亚洲啪啪网站| 丁香五月婷婷久久| 久操影视| 一区二区三区www污污污网站| 97人人爽| 久久久久久免费一级A片| 欧洲成人在线观看| 人妻丝袜中出北条麻妃| 蝌蚪窝免费视频| 国产视频导航| 亚洲AV无码乱码国产精品黑人| 国产Av一区二区三区| 青草成人在线| 免费看操片| 中文字幕高清在线中文字幕中文字幕 | 成人午夜视频在线观看| 人妻懂色av粉嫩av浪潮av| 浮力影院欧美| 九九视屏| 99热在线观看免费精品| 欧美成人精品无码网站| 69国产精品无码免费| 亚洲日韩中文字幕| 成人精品一区日本无码网站suv/ | 51嘿嘿嘿国产精品伦理| 欧美成人免费网站| 国产精品无码一区二区三| 久久久久亚洲AV无码麻豆| 大香蕉最新国产2025| 日中文字幕| 97人人操| 久久精品五月天| 免费在线观看黄色视频| 亚洲天堂无| 五月婷婷婷| 国产精品777777| 国产精品永久免费| 人妻体内射精| 亚洲在线无码视频| 大鸡巴久久久久| 国产免费一区二区| 青青久久91| 超碰人人艹| 成人性爱视频免费在线观看| 亚洲中文字幕2025| 天天拍天天日| 黄色小视频在线观看| 亚洲成人h| 2025国产精品| 在线久操| 少妇搡BBBB搡BBB搡澳门| 黄色一级大片在线免费看国产| 国产91无码精品秘入口新欢| 永久免费AV无码| 97无码人妻| 久久综合17p| 人妻精品| 色天堂污| 五月丁香啪啪啪| 午夜激情乱伦| 这里只有精品91| 国产乱伦对白| 精国产品一区二区三区A片| 黄片免费在线播放| 三级99| 青草91| 午夜试看120秒体验区的特点 | 大香蕉伊人影视| 亚洲A级片| 影音先锋av网| 亚洲视频综合| 日韩在线成人中文字幕亚洲| 黄色视频网站在线| 亚洲尤物| 午夜撸一撸| 超碰免费观看| 91人妻日韩人妻无码专区精品| 久久成人小电影| 91国产精品在线视频| 免费日韩| 成人一区二区在线观看| www.啪啪| 777777国产7777777| 懂色av懂色av粉嫩av分享吧 | 五月婷婷综合在线| 影音先锋乱伦电影| 六月激情婷婷| 成人网站AV| 99精品热| 日韩黄色免费电影| 亚洲欧美日韩无码| 亚洲三级视频在线观看| 日本免费在线黄色视频| 日日精品| 中文在线一区| 西西4444WWW无视频| 日韩成人无码人妻| 亚洲黄色在线播放| 日日爽夜夜爽| 日韩不卡AV| 日韩欧美日本| 青青无码| 18禁看网站| 中文字幕精品无码亚| 波多野结衣无码AV| 大香蕉伊人成人| 无码AV大香线蕉伊人| 成人天堂一区二区三区| 99这里只有精品| 四虎成人精品在永久免费| 亚洲欧美手机在线| 久久cao| 操逼逼片| 无码22p| 做爱视频无码| 成人网站一区二区| 日本精品人妻无码77777| 亚洲区中文字幕| 九九九色视频| 无码一区二区三区在线| 在线天堂999| 韩国三级中文字幕HD久久精品| 夜夜夜操| 亚洲成人a| 亚洲综合在线视频| 成人免费毛片蓝莓| 亚洲中文无码AV在线| 欧美性爱在线观看| 偷拍二区| 色婷婷香蕉在线一区二区| 中文字幕在线观看av| 亚洲AV无码精品久久一区二区 | 少妇在线视频| 狠狠狠狠狠狠| 十八女人高潮A片免费| 麻豆精品国产| 91色噜噜狠狠色婷婷| 欧美日韩中文字幕视频| 91在线无码精品国产三年| 亚洲三级视频在线观看| 日韩亚洲精品中文字幕| 久久青留社区金玉| 精品综合网| 波多野结衣国产区42部| 久久久精品影院| 中文字幕免费高清在线观看| 97人妻一区二区精品视频| 熟女456| www.国产精品| 一级大片免费看| 亚洲国产成人精品午夜| 水蜜桃一曲二区| 免费在线观看无码视频| 特级西西444www高清大胆免费看 | 高清av无码| 少妇喷水视频| 中文字幕9| AV无码高清| 999久久| 在线视频观看一区| 躁BBB躁BBB躁BBBBBB| 成人无码区免费| 国产三级精品三级在线观看| 日韩免费在线观看一区入口| 91久久国产综合| 欧美囗交大荫蒂免费| 超碰最新在线观看| 在线无码免费| 一级片久久| 永久在线| 国产精品视频一区二区三区在线观看| 日韩无码AV电影| 亚洲成年视频| 久久蜜桃成人| 夜夜撸| 91成人小电影| 国产毛片一区| 午夜成人国产| 日本黄色视频免费看| 狼人狠狠干| 日韩无码视频观看| 久久综合久久鬼色| 黄色精品视频| 俺来也俺也啪WWW色| 成人午夜天堂| 999国产精品视频| 亚洲久操| 中文字幕免费高清网站| 暖暖av| 爱搞在线观看wwww| 欧洲精品在线观看| 亚洲V国产v欧美v久久久久久| jt33免费观看高清| 97无码人妻一区二区三区| 国产一级AAAAA片免费| 老太色HD色老太HD| 人妻在线免费视频| 精国产品一区二区三区A片| 黄色在线观看免费| 午夜av在线观看| 大学生一级特黄大片| 超碰997| 搡BBB搡BBBB搡BBBB| 丰满人妻一区二区三区蜜桃视频| 欧美成人视频网| 在线视频观看一区| 黃色A片一級二級三級免費久久久| 欧美大黑逼| 国产精品国产三级国产AⅤ原创| 亚洲成人a| 午夜精品成人| 婷婷五月天丁香| 亚洲无码av在线播放| 日本一级视频| 黄色A毛片| 久久久中文字幕| 无码一区二区三区免费| 在线免费看a| 色欲五月天| 黄色视频在线观看| 苍井空无码一区二区三区| 亚洲中文在线播放| 国产精品偷拍| 99久久99久久精品免费看小说。| 国产成人精品a视频一区| 中文字幕在线观看一区二区三区| 九色在线视频| 999久久久| 中文字幕丰满熟妇人妻| 久久福利视频导航| 无码一级A片| 操逼视频免费看| 欧美国产综合| 爆操熟女| 午夜AV在线免费观看| 国产成人自拍网| 国产一级a毛片| 99在线观看| 人妻视频网站| 日本亚洲黄色视频| 欧美一级久久| 少妇搡BBBB搡BBB搡毛片少妇| 国产女人18毛片水18精品软件| 成人av黄色三级片在线观看| 日本色色网| 少妇bbw搡bbbb搡bbbb| 欧美三级推荐| 翔田千里无码A片| 操逼视频看看| 五月婷婷开心| 亚洲激情黑人| 乱伦A片| 伊人激情五月天| 先锋影音中文字幕| 国产精品久久久久久精| 国产一级二级片| 男人天堂网AV| 五月无码视频| 蜜桃视频在线观看18| 成人欧美在线| 国产精品成人无码| 老婆中文字幕乱码中文乱码| 久久久久99精品成人片三人毛片| 亚洲三级在线免费观看| 西西444WWW无码视频软件功能介绍| 久久嫩草精品久久久久精| 草逼免费视频| 亚洲中文字幕免费观看| 国产精品国产精品国产专区 | 东方AV在线观看| 人妻久久久| 青青操逼网| 蝌蚪窝免费视频| 在线视频A| 国产主播AV| 91人体视频| 中国一级黄色A片| 99成人| 激情五月天网站| 欧美性猛交XXXX乱大交蜜桃| 特级毛片WWW| 中文字幕一二三区| 美女视频毛片| 丁香六月婷婷综合缴| 丁香五月成人网| 国产精品一区二区黑人巨大| 麻豆精品国产| 巨い巨乳の少妇あジed2k| 成人网在线视频| 插菊花综合网2| 内射国产| 92丨九色丨偷拍老熟女| 激情国产视频| 欧美A片在线播放| 亚洲男人的天堂AV| 97国产成人| 激情无码在线观看| 成人黄色AV网站| 国产—级a毛—a毛免费视频| 丁香五月一区二区| 亚洲影院中文字幕| 天堂无线av无码av| 欧美成人视频18| 欧美操B视频| 国产一级大片| 人妻视频网站| 91.xxxxx| 精东影业秘国产传媒| 中文字幕人妻互换av久久| 亚洲精品人妻在线| 亚洲日韩中文在线| AV一区二区在线观看| 亚洲网站在线播放| 亚洲欧美日韩另类| 超碰福利导航| 国产精品久久久久久无人区| 欧美亚洲精品在线| 三级视频国产| 好好日视频| 欧美色图自拍| 嘿嘿午夜影院| 午夜噜噜| 中国老少配BBwBBwBBW| 亚洲无码一卡| 5252a我爱haose01我愿| 中文字幕在线播放AV| 亚洲国产成人va| 日韩性爱一区二区| 日韩精品一区二区三区四在线播放| 日本高清色清di免费观看| 影音先锋资源| 亚洲日韩中文字幕| 欧美mv日韩mv国产网站| 波多野结衣一区二区三区| 伊人免费| 中文字幕在线观看一区| 亚洲av电影在线观看| 91热视频| 成人无码在线播放| 久草91| 欧美日韩一区二区三区| 日韩A级片| 无码中文视频| 丁香五月天婷婷| 人人色人人色| 在线一区| 蜜桃av.38| 日本欧美操| 中文字幕观看av| 开心色色五月天| 韩国中文字幕HD久久精品| 最美孕交vivoestv另类| 亚洲操逼无码| 成人网站视频在线免费观看| 韩日不卡视频| 国产精品探花熟女AV| 中文字幕在线欧美| 在线免费观看黄色| 超碰在线观看97| 丁香五香天堂网| 国产欧美一区在线看| 中文字幕在线观看a| 天堂8在线19| 国产女人18毛片水真多18| 国产草逼网站| 嫩草国产在线| 亚洲成人精品AV| 一区二区A片| 日韩在线观看一区二区| 少妇bbb| 亚洲精品一区二区三区新线路| 天天拍天天操| 尤物网在线| 免费看黃色AAAAAA片| 亚洲视频第一页| 亚洲欧美色图| 韩国中文字幕HD久久精品| 插入综合网| 思思热在线视频精品| 天堂视频在线观看亚洲美女| 国产91探花精品一区二区| 日中文字幕| 韩日AV| 热久久精品| 精品偷拍视频| 狠狠网| 99热在线播放| 人人操干| 国产欧美一区二区三区特黄手机版| 最近中文字幕中文翻译歌词| 操屄在线观看| 国产熟女露脸普通话对白| 西西444WWW无码精品| 手机看片1204| 欧美色图15P| 69无码| 亚洲色在线视频| 久久青草影院| 黄色视频在线观看| 加勒比操逼| 国产区欧美去区在线| 国产美女av| 17c精品麻豆一区二区免费 | 777性爱| 久久国产日韩| 国产免费一级特黄A片| 亚洲精品成人无码AV在线| 亚洲激情黄色| 久操视频在线播放| 精品欧美一区二区三区| 免费中文资源在线观看| 亚洲高清视频无码| 中文字幕东京热| 成人一区在线观看| 日韩天堂网| 18毛片| 国产内射在线观看| 91超碰在线| 精品蜜桃秘一区二区三区观看| 欧一美一婬一伦一区二区三区| 真实白嫖91探花无码| 乱子伦国产精品www| 亚洲高清无码在线播放| 一级A片亲子乱| 亚洲日韩一区| 思思热精品在线| 思思热免费视频| 天天综合在线观看| 久热福利视频| 青青草精品视频| 亚洲日韩精品秘在线观看| 国产成人片色情AAAA片| 亚洲福利社| 亚洲日韩在线中文字幕| 国产精品粉嫩福利在线| 日韩特级片| 人妻人人爽| 日韩做爱| 国产黄色在线看| 无码AV动漫| 人妻人人澡| 1024在线视频| 成人夜间视频| 大香蕉综合伊人| 豆花视频在线看| 免费色网站| 国产一区二区三区免费| 日韩aaa| 巨乳一区二区三区| 亚洲成人在线免费| 日韩射| 99免费精品视频| 丁香五月综合| 日本少妇bbw| 国产精品久久久久久99| 亚洲无码在线视频观看| 88AV在线| 日本无码在线| 日韩一区二区免费看| 国产真实乱婬A片久久久老牛| 91av免费在线观看| 亚洲综合免费观看高清| 另类老妇奶性生BBwBB| 中文无码高清在线| 午夜福利电影AV| 国产三级在线观看视频| 久草综合视频| 最新人妻| 动漫人物插画动漫人物的视频软件| 亚洲欧美日韩另类| 尤物最新网址| a在线视频| 国产三级黄色片| 亚洲AV无码成人精品区久| 国产福利91| 国产第一页在线| 成人AV免费观看| 97伊人超碰| 亚洲AV免费电影| 成人区精品一区二区婷婷| 嫩BBB嗓BBBB榛BBBB| 久久久久久免费一级A片| 欧美一本在线| 干干日日| 麻豆性爱| 日欧视频| 美日韩一区二区三区| 三级久久久| 国产视频一区二区三区四区| 性爱AV网| 久久狼人| 午夜AV无码| 淫乱骚穴| 日韩高清无码免费观看| 色资源站| 亚洲中文字幕在线免费观看视频| 在线观看国产区| 日韩日批| 性欧美69| 日韩无码精品视频| 操15p| 婷婷毛片| 一道本一区二区| 北条麻妃久久视频在线播放 | 中文无码第一页| 亚洲口爆| 无套内射在线免费观看| 亚洲色图欧美在线| 欧美日韩国产中文字幕| 午夜熟睡乱子伦视频| 尤物综合网| 国产成人精品免费看视频| 一二区视频| 亚洲AV官方网站| 老熟女搡BBBB搡BBBB视频| 亚洲精品中文字幕在线观看 | 成人国产精品秘欧美高清| 欧美日韩在线视频一区| 国产黄色三级| 中文字幕在线观看福利视频| 大香蕉伊人视频在线观看| 国产在线视频一区二区三区 | 欧美色图第一页| 在线观看成人三级片| 国产黄色小视频在线观看| 岛国av在线播放| 国产在线观看欧美| 久久久久黄片| 五月天久久婷婷| 亚洲免费网站| 久操麻豆| 免费一级A片在线播放| 91视频一区| 国产精品久久7777777精品无码| 国产精品秘久久久久久1-~/\v7-/| 内射视频在线观看| 女人久久久久| 丰满人妻一区二区三区视频54| 操b在线观看| 欧美黄色操逼| 国产又爽又黄免费| www欧美| 男女性爱视频免费| 欧美亚洲日韩在线观看| av中文字幕在线播放| 91丨九色丨熟女老版| 国产一级片电影| 69AV在线视频| 伊人色爱| 日本免费在线视频| 国产成人一区二区三区| 亚洲少妇网| 男人资源网| 亚洲日韩成人| 操逼免费观看视频| 操逼视频免费网站| 欧美黄片网站| 黄色视频网站观看| av资源免费| 亚洲欧美综合| 午夜偷拍视频| 中文在线字幕高清电视剧| 日韩欧美视频一区国产欧美在线| www.五月天.con| 一级A黄色片| JlZZJLZZJlZZ亚洲女人17| 国产不卡在线视频| 豆花成人视频| 996精品在线| 深夜福利av| 国产成人片| 91无码一区二区三区| 伊人久久免费视频| 五月丁香激情六月| 在线aaa| 久久久国产精品黄毛片| 日韩免费性爱视频| xxxxx日韩| 褒姒AV无玛| 永久免费AV| 最新超碰| 艹逼视频免费观看| 一道本一区二区三区| 女侠吕四娘第二部| 亚洲精品国产精品国自产| 九九这里有精品| 日韩一区二区三区在线视频| 美女福利在线| 中文字幕精品人妻在线| 少妇人妻AV| 国产又大又粗又长| 伊人激情影院| 久久综合伊人777777| 美女黄网站| 美女超碰| 中文字幕亚洲在线观看| 高清无码久久| 91国产视频在线观看| 黄频美女日本免费| 成人无码免费视频| 大香蕉久草|