久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET 5 中的正则引擎性能改进(翻译)

發布時間:2023/12/4 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET 5 中的正则引擎性能改进(翻译) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

System.Text.RegularExpressions?命名空間已經在 .NET 中使用了多年,一直追溯到 .NET Framework 1.1。它在 .NET 實施本身的數百個位置中使用,并且直接被成千上萬個應用程序使用。在所有這些方面,它也是 CPU 消耗的重要來源。

但是,從性能角度來看,正則表達式在這幾年間并沒有獲得太多關注。在 2006 年的 .NET Framework 2.0 中更改了其緩存策略。.NET Core 2.0 在?RegexOptions.Compiled?之后看到了這個實現的到來(在 .NET Core 1.x 中,RegexOptions.Compiled?選項是一個 nop)。.NET Core 3.0 受益于 Regex 內部的一些內部更新,以在某些情況下利用?Span<T>?提高內存利用率。在此過程中,一些非常受歡迎的社區貢獻改進了目標區域,例如?dotnet/corefx#32899,它減少了使用表達式?RegexOptions.Compiled | RegexOptions.IgnoreCase?時對CultureInfo.CurrentCulture?的訪問。但除此之外,實施很大程度上還是在15年前。

對于 .NET 5(本周發布了?Preview 2),我們已對 Regex 引擎進行了一些重大改進。在我們嘗試過的許多表達式中,這些更改通常會使吞吐量提高3到6倍,在某些情況下甚至會提高更多。在本文中,我將逐步介紹 .NET 5 中?System.Text.RegularExpressions?進行的許多更改。這些更改對我們自己的使用產生了可衡量的影響,我們希望這些改進將帶來可衡量的勝利在您的庫和應用中。

Regex內部知識

要了解所做的某些更改,了解一些Regex內部知識很有幫助。

Regex構造函數完成所有工作,以采用正則表達式模式并準備對其進行匹配輸入:

  • RegexParser。該模式被送入內部RegexParser類型,該類型理解正則表達式語法并將其解析為節點樹。例如,表達式a|bcd被轉換為具有兩個子節點的“替代”?RegexNode,一個子節點表示單個字符a,另一個子節點表示“多個”?bcd。解析器還對樹進行優化,將一棵樹轉換為另一個等效樹,以提供更有效的表示和/或可以更高效地執行該樹。

  • RegexWriter。節點樹不是執行匹配的理想表示,因此解析器的輸出將饋送到內部RegexWriter類,該類會寫出一系列緊湊的操作碼,以表示執行匹配的指令。這種類型的名稱是“ writer”,因為它“寫”出了操作碼。其他引擎通常將其稱為“編譯”,但是 .NET 引擎使用不同的術語,因為它保留了“編譯”術語,用于 MSIL 的可選編譯。

  • RegexCompiler(可選)。如果未指定RegexOptions.Compiled選項,則內部RegexInterpreter類稍后在匹配時使用RegexWriter輸出的操作碼來解釋/執行執行匹配的指令,并且在Regex構造過程中不需要任何操作。但是,如果指定了RegexOptions.Compiled,則構造函數將獲取先前輸出的資產,并將其提供給內部RegexCompiler類。然后,RegexCompiler使用反射發射生成MSIL,該MSIL表示解釋程序將要執行的工作,但專門針對此特定表達式。例如,當與模式中的字符“ c”匹配時,解釋器將需要從變量中加載比較值,而編譯器會將“ c”硬編碼為生成的IL中的常量。

一旦構造了正則表達式,就可以通過IsMatch,Match,Matches,Replace和Split等實例方法將其用于匹配(Match返回Match對象,該對象公開了NextMatch方法,該方法可以迭代匹配并延遲計算) 。這些操作最終以“掃描”循環(某些其他引擎將其稱為“傳輸”循環)結束,該循環本質上執行以下操作:

Copywhile (FindFirstChar()) {Go();if (_match != null)return _match;_pos++; } return null;

_pos是我們在輸入中所處的當前位置。virtual FindFirstChar從_pos開始,并在輸入文本中查找正則表達式可能匹配的第一位;這并不是執行完整引擎,而是盡可能高效地進行搜索,以找到值得運行完整引擎的位置。?FindFirstChar可以最大程度地減少誤報,并且找到有效位置的速度越快,表達式的處理速度就越快。如果找不到合適的起點,則可能沒有任何匹配,因此我們完成了。如果找到了一個好的起點,它將更新_pos,然后通過調用virtual Go來在找到的位置執行引擎。如果Go找不到匹配項,我們會碰到當前位置并重新開始,但是如果Go找到匹配項,它將存儲匹配信息并返回該數據。顯然,執行Go的速度也越快越好。

所有這些邏輯都在公共RegexRunner基類中。?RegexInterpreter派生自RegexRunner,并用解釋正則表達式的實現覆蓋FindFirstChar和Go,這由RegexWriter生成的操作碼表示。?RegexCompiler使用DynamicMethods生成兩種方法,一種用于FindFirstChar,另一種用于Go。委托是從這些創建的、從RegexRunner派生的另一種類型調用。

.NET 5的改進

在本文的其余部分中,我們將逐步介紹針對 .NET 5 中的 Regex 進行的各種優化。這不是詳盡的清單,但它突出了一些最具影響力的更改。

CharInClass

正則表達式支持“字符類”,它們定義了輸入字符應該或不應該匹配的字符集,以便將該位置視為匹配字符。字符類用方括號表示。這里有些例子:

  • [abc]?匹配“ a”,“ b”或“ c”。

  • [^\n]?匹配換行符以外的任何字符。(除非指定了?RegexOptions.Singleline,否則這是您在表達式中使用的確切字符類。)

  • [a-cx-z]?匹配“ a”,“ b”,“ c”,“ x”,“ y”或“ z”。

  • [\d\s\p{IsGreek}]?匹配任何Unicode數字,空格或希臘字符。(與大多數其他正則表達式引擎相比,這是一個有趣的區別。例如,在其他引擎中,默認情況下,\d通常映射到[0-9],您可以選擇加入,而不是映射到所有Unicode數字,即[\p{Nd}],而在.NET中,您默認情況下會使用后者,并使用?RegexOptions.ECMAScript?選擇退出。)

當將包含字符類的模式傳遞給Regex構造函數時,RegexParser的工作之一就是將該字符類轉換為可以在運行時更輕松地查詢的字符。解析器使用內部RegexCharClass類型來解析字符類,并從本質上提取三件事(還有更多東西,但這對于本次討論就足夠了):

  • 模式是否被否定

  • 匹配字符范圍的排序集

  • 匹配字符的Unicode類別的排序集

這是所有實現的詳細信息,但是該信息然后保留在字符串中,該字符串可以傳遞給受保護的?RegexRunner.CharInClass?方法,以確定字符類中是否包含給定的Char。

在.NET 5之前,每一次需要將一個字符與一個字符類進行匹配時,它將調用該CharInClass方法。然后,CharInClass對范圍進行二進制搜索,以確定指定字符是否存儲在一個字符中;如果不存儲,則獲取目標字符的Unicode類別,并對Unicode類別進行線性搜索,以查看是否匹配。因此,對于^\d*$之類的表達式(斷言它在行的開頭,然后匹配任意數量的Unicode數字,然后斷言在行的末尾),假設輸入了1000位數字,這加起來將對CharInClass進行1000次調用。

在 .NET 5 中,我們現在更加聰明地做到了這一點,尤其是在使用RegexOptions.Compiled時,通常,只要開發人員非常關心Regex的吞吐量,就可以使用它。一種解決方案是,對于每個字符類,維護一個查找表,該表將輸入字符映射到有關該字符是否在類中的是/否決定。雖然我們可以這樣做,但是System.Char是一個16位的值,這意味著每個字符一個位,我們需要為每個字符類使用8K查找表,并且這還要累加起來。取而代之的是,我們首先嘗試使用平臺中的現有功能或通過簡單的數學運算來快速進行匹配,以處理一些常見情況。例如,對于\d,我們現在不生成對RegexRunner.CharInClass(ch, charClassString)?的調用,而是僅生成對?char.IsDigit(ch)的調用。?IsDigit已經使用查找表進行了優化,可以內聯,并且性能非常好。類似地,對于\s,我們現在生成對char.IsWhitespace(ch)的調用。對于僅包含幾個字符的簡單字符類,我們將生成直接比較,例如對于[az],我們將生成等價于(ch =='a') | (ch =='z')。對于僅包含單個范圍的簡單字符類,我們將通過一次減法和比較來生成檢查,例如[a-z]導致(uint)ch-'a'<= 26,而?[^ 0-9]?導致?!((uint)c-'0'<= 10)。我們還將特殊情況下的其他常見規范;例如,如果整個字符類都是一個Unicode類別,我們將僅生成對char.GetUnicodeInfo(也具有快速查找表)的調用,然后進行比較,例如[\p{Lu}]變為char.GetUnicodeInfo(c)== UnicodeCategory.UppercaseLetter。

當然,盡管涵蓋了許多常見情況,但當然并不能涵蓋所有情況。而且,因為我們不想為每個字符類生成8K查找表,并不意味著我們根本無法生成查找表。相反,如果我們沒有遇到這些常見情況之一,那么我們確實會生成一個查找表,但僅針對ASCII,它只需要16個字節(128位),并且考慮到正則表達式中的典型輸入,這往往是一個很好的折衷方案基于方案。由于我們使用DynamicMethod生成方法,因此我們不容易將附加數據存儲在程序集的靜態數據部分中,但是我們可以做的就是利用常量字符串作為數據存儲;MSIL具有用于加載常量字符串的操作碼,并且反射發射對生成此類指令具有良好的支持。因此,對于每個查找表,我們只需創建所需的8個字符的字符串,用不透明的位圖數據填充它,然后在IL中用ldstr吐出。然后我們可以像對待其他任何位圖一樣對待它,例如為了確定給定的字符是否匹配,我們生成以下內容:

Copybool result = ch < 128 ? (lookup[c >> 4] & (1 << (c & 0xF))) != 0 : NonAsciiFallback;

換句話說,我們使用字符的高三位選擇查找表字符串中的第0至第7個字符,然后使用低四位作為該位置16位值的索引;如果是1,則表示匹配,如果不是,則表示沒有匹配。對于大于等于128的字符,我們需要一個回退,根據對字符類進行的一些分析,回退可能是各種各樣的事情。最糟糕的情況是,回退只是對RegexRunner.CharInClass的調用,否則我們會做得更好。例如,很常見的是,我們可以從輸入模式中得知所有可能的匹配項均小于<128,在這種情況下,我們根本不需要回退,例如 對于字符類[0-9a-fA-F](又稱十六進制),我們將生成以下內容:

Copybool result = ch < 128 && (lookup[c >> 4] & (1 << (c & 0xF))) != 0;

相反,我們可以確定127以上的每個字符都將去匹配。例如,字符類[^aeiou](除ASCII小寫元音外的所有字符)將產生與以下代碼等效的代碼:

Copybool result = ch >= 128 || (lookup[c >> 4] & (1 << (c & 0xF))) != 0;

等等。

以上都是針對RegexOptions.Compiled,但解釋表達式并不會被冷落。對于解釋表達式,我們當前會生成一個類似的查找表,但是我們這樣做是很懶惰的,第一次看到給定輸入字符時會填充該表,然后針對該字符類針對該字符的所有將來評估存儲該答案。(我們可能會重新研究如何執行此操作,但這是從 .NET 5 Preview 2 開始存在的方式。)

這樣做的最終結果可能是頻繁評估字符類的表達式的吞吐量顯著提高。例如,這是一個微基準測試,可將ASCII字母和數字與具有62個此類值的輸入進行匹配:

Copyusing BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using System.Text.RegularExpressions;public class Program {static void Main(string[] args) => BenchmarkSwitcher.FromAssemblies(new[] { typeof(Program).Assembly }).Run(args);private Regex _regex = new Regex("[a-zA-Z0-9]*", RegexOptions.Compiled);[Benchmark] public bool IsMatch() => _regex.IsMatch("abcdefghijklmnopqrstuvwxyz123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); }

這是我的項目文件:

Copy<project Sdk="Microsoft.NET.Sdk"><propertygroup><langversion>preview</langversion><outputtype>Exe</outputtype><targetframeworks>netcoreapp5.0;netcoreapp3.1</targetframeworks></propertygroup><itemgroup><packagereference Include="benchmarkdotnet" Version="0.12.0.1229"></packagereference></itemgroup> </project>

在我的計算機上,我有兩個目錄,一個包含.NET Core 3.1,一個包含.NET 5的內部版本(此處標記為master,因為它是dotnet/runtime的master分支的內部版本)。當我執行以上操作針對兩個版本運行基準測試:

Copydotnet run -c Release -f netcoreapp3.1 --filter ** --corerun d:\coreclrtest\netcore31\corerun.exe d:\coreclrtest\master\corerun.exe

我得到了以下結果:

MethodToolchainMeanErrorStdDevRatio
IsMatch\master\corerun.exe102.3 ns1.33 ns1.24 ns0.17
IsMatch\netcore31\corerun.exe585.7 ns2.80 ns2.49 ns1.00

開發人員可能會寫的代碼生成器

如前所述,當RegexOptions.Compiled與Regex一起使用時,我們使用反射發射為其生成兩種方法,一種實現FindFirstChar,另一種實現Go。為了支持回溯,Go最終包含了很多通常不需要的代碼。生成代碼的方式通常包括不必要的字段讀取和寫入,導致檢查JIT無法消除的邊界等。在 .NET 5 中,我們改進了為許多表達式生成的代碼。

考慮表達式@"a\sb",它匹配一個'a',任何Unicode空格和一個'b'。以前,反編譯為Go發出的IL看起來像這樣:

Copypublic override void Go() {string runtext = base.runtext;int runtextstart = base.runtextstart;int runtextbeg = base.runtextbeg;int runtextend = base.runtextend;int num = runtextpos;int[] runtrack = base.runtrack;int runtrackpos = base.runtrackpos;int[] runstack = base.runstack;int runstackpos = base.runstackpos;CheckTimeout();runtrack[--runtrackpos] = num;runtrack[--runtrackpos] = 0;CheckTimeout();runstack[--runstackpos] = num;runtrack[--runtrackpos] = 1;CheckTimeout();if (num < runtextend && runtext[num++] == 'a'){CheckTimeout();if (num < runtextend && RegexRunner.CharInClass(runtext[num++], "\0\0\u0001d")){CheckTimeout();if (num < runtextend && runtext[num++] == 'b'){CheckTimeout();int num2 = runstack[runstackpos++];Capture(0, num2, num);runtrack[--runtrackpos] = num2;runtrack[--runtrackpos] = 2;goto IL_0131;}}}while (true){base.runtrackpos = runtrackpos;base.runstackpos = runstackpos;EnsureStorage();runtrackpos = base.runtrackpos;runstackpos = base.runstackpos;runtrack = base.runtrack;runstack = base.runstack;switch (runtrack[runtrackpos++]){case 1:CheckTimeout();runstackpos++;continue;case 2:CheckTimeout();runstack[--runstackpos] = runtrack[runtrackpos++];Uncapture();continue;}break;}CheckTimeout();num = runtrack[runtrackpos++];goto IL_0131;IL_0131:CheckTimeout();runtextpos = num; }

那里有很多東西,需要斜視和搜索才能將實現的核心看作方法的中間幾行。現在在.NET 5中,相同的表達式導致生成以下代碼:

Copyprotected override void Go() {string runtext = base.runtext;int runtextend = base.runtextend;int runtextpos;int start = runtextpos = base.runtextpos;ReadOnlySpan<char> readOnlySpan = runtext.AsSpan(runtextpos, runtextend - runtextpos);if (0u < (uint)readOnlySpan.Length && readOnlySpan[0] == 'a' &&1u < (uint)readOnlySpan.Length && char.IsWhiteSpace(readOnlySpan[1]) &&2u < (uint)readOnlySpan.Length && readOnlySpan[2] == 'b'){Capture(0, start, base.runtextpos = runtextpos + 3);} }

如果您像我一樣,則可以注視著眼睛看第一個版本,但是如果您看到第二個版本,則可以真正閱讀并了解它的功能。除了易于理解和易于調試之外,它還減少了執行的代碼,消除了邊界檢查,減少了對字段和數組的讀寫等方面的工作。最終的結果是它的執行速度也快得多。(這里還有進一步改進的可能性,例如刪除兩個長度檢查,可能會重新排序一些檢查,但總的來說,它比以前有了很大的改進。)

向量化的基于?Span?的搜索

正則表達式都是關于搜索內容的。結果,我們經常發現自己正在運行循環以尋找各種事物。例如,考慮表達式?hello.*world。以前,如果要反編譯我們在Go方法中生成的用于匹配.*的代碼,則該代碼類似于以下內容:

Copywhile (--num3 > 0) {if (runtext[num++] == '\n'){num--;break;} }

換句話說,我們將手動遍歷輸入文本字符串,逐個字符地查找?\n(請記住,默認情況下,.表示“?\n以外的任何內容”,因此.*表示“匹配所有內容,直到找到\n” )。但是,.NET早已擁有完全執行此類搜索的方法,例如IndexOf,并且從最新版本開始,IndexOf是矢量化的,因此它可以同時比較多個字符,而不僅僅是單獨查看每個字符。現在,在.NET 5中,我們不再像上面那樣生成代碼,而是得到如下代碼:

Copynum2 = runtext.AsSpan(runtextpos, num).IndexOf('\n');

使用IndexOf而不是生成我們自己的循環,則意味著對Regex中的此類搜索進行隱式矢量化,并且對此類實現的任何改進也都應歸于此。這也意味著生成的代碼更簡單。可以用這樣的基準測試來查看其影響:

Copyusing BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using System.Text.RegularExpressions;public class Program {static void Main(string[] args) => BenchmarkSwitcher.FromAssemblies(new[] { typeof(Program).Assembly }).Run(args);private Regex _regex = new Regex("hello.*world", RegexOptions.Compiled);[Benchmark] public bool IsMatch() => _regex.IsMatch("hello. this is a test to see if it's able to find something more quickly in the world."); }

即使輸入的字符串不是特別大,也會產生可衡量的影響:

MethodToolchainMeanErrorStdDevRatio
IsMatch\master\corerun.exe71.03 ns0.308 ns0.257 ns0.47
IsMatch\netcore31\corerun.exe149.80 ns0.913 ns0.809 ns1.00

IndexOfAny最終還是.NET 5實現中的重要工具,尤其是對于FindFirstChar的實現。.NET Regex實現使用的現有優化之一是對可以開始表達式的所有可能字符進行分析。生成一個字符類,然后FindFirstChar使用該字符類對可能開始匹配的下一個位置生成搜索。這可以通過查看表達式([ab]cd|ef [g-i])jklm的生成代碼的反編譯版本來看到。與該表達式的有效匹配只能以'a','b'或'e'開頭,因此優化器生成一個字符類[abe],FindFirstChar然后使用:

Copypublic override bool FindFirstChar() {int num = runtextpos;string runtext = base.runtext;int num2 = runtextend - num;if (num2 > 0){int result;while (true){num2--;if (!RegexRunner.CharInClass(runtext[num++], "\0\u0004\0acef")){if (num2 <= 0){result = 0;break;}continue;}num--;result = 1;break;}runtextpos = num;return (byte)result != 0;}return false; }

這里需要注意的幾件事:

  • 正如前面所討論的,我們可以看到每個字符都是通過CharInClass求值的。我們可以看到傳遞給CharInClass的字符串是該類的內部可搜索表示(第一個字符表示沒有取反,第二個字符表示有四個用于表示范圍的字符,第三個字符表示沒有Unicode類別) ,然后接下來的四個字符代表兩個范圍,分別包含下限和上限。

  • 我們可以看到我們分別評估每個字符,而不是能夠一起評估多個字符。

  • 我們只看第一個字符,如果匹配,我們退出以允許引擎完全執行Go。

在.NET 5 Preview 2中,我們現在生成此代碼:

Copyprotected override bool FindFirstChar() {int runtextpos = base.runtextpos;int runtextend = base.runtextend;if (runtextpos <= runtextend - 7){ReadOnlySpan<char> readOnlySpan = runtext.AsSpan(runtextpos, runtextend - runtextpos);for (int num = 0; num < readOnlySpan.Length - 2; num++){int num2 = readOnlySpan.Slice(num).IndexOfAny('a', 'b', 'e');num = num2 + num;if (num2 < 0 || readOnlySpan.Length - 2 <= num){break;}int num3 = readOnlySpan[num + 1];if ((num3 == 'c') | (num3 == 'f')){num3 = readOnlySpan[num + 2];if (num3 < 128 && ("\0\0\0\0\0\0?\0"[num3 >> 4] & (1 << (num3 & 0xF))) != 0){base.runtextpos = runtextpos + num;return true;}}}}base.runtextpos = runtextend;return false; }

這里要注意一些有趣的事情:

  • 現在,我們使用IndexOfAny搜索三個目標字符。?IndexOfAny是矢量化的,因此它可以利用SIMD指令一次比較多個字符,并且我們為進一步優化IndexOfAny所做的任何未來改進都將隱式歸于此類FindFirstChar實現。

  • 如果IndexOfAny找到匹配項,我們不只是立即返回以給Go機會執行。相反,我們對接下來的幾個字符進行快速檢查,以增加這實際上是匹配項的可能性。在原始表達式中,您可以看到可能與第二個字符匹配的唯一值是'c'和'f',因此該實現對這些字符進行了快速比較檢查。您會看到第三個字符必須與'd'或[g-i]匹配,因此該實現將這些字符組合到單個字符類[dg-i]中,然后使用位圖對其進行評估。后兩個字符檢查都突出了我們現在為字符類發出的改進的代碼生成。

我們可以在這樣的測試中看到這種潛在的影響:

Copyusing BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using System; using System.Linq; using System.Text.RegularExpressions;public class Program {static void Main(string[] args) => BenchmarkSwitcher.FromAssemblies(new[] { typeof(Program).Assembly }).Run(args);private static Random s_rand = new Random(42);private Regex _regex = new Regex("([ab]cd|ef[g-i])jklm", RegexOptions.Compiled);private string _input = string.Concat(Enumerable.Range(0, 1000).Select(_ => (char)('a' + s_rand.Next(26))));[Benchmark] public bool IsMatch() => _regex.IsMatch(_input); }

在我的機器上會產生以下結果:

MethodToolchainMeanErrorStdDevRatio
IsMatch\master\corerun.exe1.084 us0.0068 us0.0061 us0.08
IsMatch\netcore31\corerun.exe14.235 us0.0620 us0.0550 us1.00

先前的代碼差異也突出了另一個有趣的改進,特別是舊代碼的int num2 = runtextend-num;`` if(num2> 0)和新代碼的if(runtextpos <= runtextend-7)之間的差異。。如前所述,RegexParser將輸入模式解析為節點樹,然后對其進行分析和優化。.NET 5包括各種新的分析,有些簡單,有些更復雜。較簡單的示例之一是解析器現在將對表達式進行快速掃描,以確定是否必須有最小輸入長度才能匹配輸入。考慮一下表達式[0-9]{3}-[0-9]{2}-[0-9]{4},該表達式可用于匹配美國的社會保險號(三個ASCII數字,破折號,兩個ASCII數字,一個破折號,四個ASCII數字)。我們可以很容易地看到,此模式的任何有效匹配都至少需要11個字符;如果為我們提供了10個或更少的輸入,或者如果我們在輸入末尾找到10個字符以內卻沒有找到匹配項,那么我們可能會立即使匹配項失敗而無需進一步進行,因為這是不可能的匹配。

Copyusing BenchmarkDotNet.Attributes; using BenchmarkDotNet.Diagnosers; using BenchmarkDotNet.Running; using System.Text.RegularExpressions;public class Program {static void Main(string[] args) => BenchmarkSwitcher.FromAssemblies(new[] { typeof(Program).Assembly }).Run(args);private readonly Regex _regex = new Regex("[0-9]{3}-[0-9]{2}-[0-9]{4}", RegexOptions.Compiled);[Benchmark] public bool IsMatch() => _regex.IsMatch("123-45-678"); } MethodToolchainMeanErrorStdDevRatio
IsMatch\master\corerun.exe19.39 ns0.148 ns0.139 ns0.04
IsMatch\netcore31\corerun.exe459.86 ns1.893 ns1.771 ns1.00

回溯消除

.NET Regex實現當前使用回溯引擎。這種實現可以支持基于DFA的引擎無法輕松或有效地支持的各種功能,例如反向引用,并且在內存利用率以及常見情況下的吞吐量方面都非常高效。但是,回溯有一個很大的缺點,那就是可能導致退化的情況,即匹配在輸入長度上花費了指數時間。這就是.NET Regex類公開設置超時的功能的原因,因此失控匹配可能會被異常中斷。

.NET文檔提供了更多詳細信息,但可以這樣說,開發人員可以編寫正則表達式,而不會受到過多的回溯。一種方法是采用“原子組”,該原子組告訴引擎,一旦組匹配,實現就不得回溯到它,通常在這種回溯不會帶來好處的情況下使用。考慮與輸入aaaa匹配的示例表達式a+b:

  • Go引擎開始匹配a+。此操作是貪婪的,因此它匹配第一個a,然后匹配aa,然后匹配aaa,然后匹配aaaa。然后,它會顯示在輸入的末尾。

  • 沒有b匹配,因此引擎回溯1,而a+現在匹配aaa。

  • 仍然沒有b匹配,因此引擎回溯1,而a+現在匹配aa。

  • 仍然沒有b匹配,因此引擎回溯1,而a+現在匹配a。

  • 仍然沒有b可以匹配,而a+至少需要1個a,因此匹配失敗。

但是,所有這些回溯都被證明是不必要的。?a+不能匹配b可以匹配的東西,因此在這里進行大量的回溯是不會有成果的。看到這一點,開發人員可以改用表達式(?>a+)b。?(?>和)是原子組的開始和結束,它表示一旦該組匹配并且引擎經過該組,則它一定不能回溯到該組中。然后,使用我們之前針對aaaa進行匹配的示例,則將發生這種情況:

  • Go引擎開始匹配?a+。此操作是貪婪的,因此它匹配第一個a,然后匹配aa,然后匹配?aaa,然后匹配?aaaa。然后,它會顯示在輸入的末尾。

  • 沒有匹配的b,因此匹配失敗。

簡短得多,這只是一個簡單的示例。因此,開發人員可以自己進行此分析并找到手動插入原子組的位置,但是,實際上,有多少開發人員認為這樣做或花費時間呢?

相反,.NET 5現在將正則表達式作為節點樹優化階段的一部分進行分析,在發現原子組不會產生語義差異但可以幫助避免回溯的地方添加原子組。例如:

a+b將變成(?>a+)b1,因為沒有任何a+可以“回饋”與b相匹配的內容

\d+\s*將變成(?>\d+)(?>\s*),因為沒有任何可以匹配\d的東西也可以匹配\s,并且\s在表達式的末尾。

a*([xyz]|hello)將變為(?>a*)([xyz]|hello),因為在成功匹配中,a可以跟著x,y,z或h,并且沒有與任何這些重疊。

這只是.NET 5現在將執行的樹重寫的一個示例。它將進行其他重寫,部分目的是消除回溯。例如,現在它將合并彼此相鄰的各種形式的循環。考慮退化的例子a*a*a*a*a*a*a*b。在.NET 5中,現在將其重寫為功能上等效的a*b,然后根據前面的討論將其進一步重寫為(?>a*)b。這將潛在的非常昂貴的執行轉換為具有線性執行時間的執行。由于我們正在處理不同的算法復雜性,因此顯示示例基準幾乎沒有意義,但是無論如何我還是會這樣做,只是為了好玩:

Copyusing BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using System.Text.RegularExpressions;public class Program {static void Main(string[] args) => BenchmarkSwitcher.FromAssemblies(new[] { typeof(Program).Assembly }).Run(args);private Regex _regex = new Regex("a*a*a*a*a*a*a*b", RegexOptions.Compiled);[Benchmark] public bool IsMatch() => _regex.IsMatch("aaaaaaaaaaaaaaaaaaaaa"); } MethodToolchainMeanErrorStdDevRatio
IsMatch\master\corerun.exe379.2 ns2.52 ns2.36 ns0.000
IsMatch\netcore31\corerun.exe22,367,426.9 ns123,981.09 ns115,971.99 ns1.000

回溯減少不僅限于循環。輪換表示回溯的另一個來源,因為實現方式的匹配方式與您手動匹配時的方式類似:嘗試一個輪換分支并繼續進行,如果匹配失敗,請返回并嘗試下一個分支,依此類推。因此,減少交替產生的回溯也是有用的。

現在執行的此類重寫之一與交替前綴分解有關。考慮針對文本什么是表達式(?:this|that)的表達式。引擎將匹配內容,然后嘗試與此匹配。它不會匹配,因此它將回溯并嘗試與此匹配。但是交替的兩個分支都以th開頭。如果我們將其排除在外,然后將表達式重寫為th(?:is|at),則現在可以避免回溯。引擎將匹配,然后嘗試將th與它匹配,然后失敗,僅此而已。

這種優化還最終使更多文本暴露給FindFirstChar使用的現有優化。如果模式的開頭有多個固定字符,則FindFirstChar將使用Boyer-Moore實現在輸入字符串中查找該文本。暴露給Boyer-Moore算法的模式越大,在快速找到匹配并最小化將導致FindFirstChar退出到Go引擎的誤報中所能做的越好。通過從這種交替中拉出文本,在這種情況下,我們增加了Boyer-Moore可用的文本量。

作為另一個相關示例,.NET 5現在發現即使開發人員未指定也可以隱式錨定表達式的情況,這也有助于消除回溯。考慮用*hello匹配abcdefghijk。該實現將從位置0開始,并在該位置計算表達式。這樣做會將整個字符串abcdefghijk與.*匹配,然后從那里回溯以嘗試匹配hello,這將無法完成。引擎將使匹配失敗,然后我們將升至下一個位置。然后,引擎將把字符串bcdefghijk的其余部分與.*進行匹配,然后從那里回溯以嘗試匹配hello,這將再次失敗。等等。在這里觀察到的是,通過碰到下一個位置進行的重試通常不會成功,并且表達式可以隱式地錨定為僅在行的開頭匹配。然后,FindFirstChar可以跳過可能不匹配的位置,并避免在這些位置嘗試進行引擎匹配。

yusing BenchmarkDotNet.Attributes;using BenchmarkDotNet.Diagnosers; using BenchmarkDotNet.Running; using System.Text.RegularExpressions;public class Program {static void Main(string[] args) => BenchmarkSwitcher.FromAssemblies(new[] { typeof(Program).Assembly }).Run(args);private readonly Regex _regex = new Regex(@".*text", RegexOptions.Compiled);[Benchmark] public bool IsMatch() => _regex.IsMatch("This is a test.\nDoes it match this?\nWhat about this text?"); } MethodToolchainMeanErrorStdDevRatio
IsMatch\master\corerun.exe644.1 ns3.63 ns3.39 ns0.21
IsMatch\netcore31\corerun.exe3,024.9 ns22.66 ns20.09 ns1.00

(只是為了清楚起見,許多正則表達式仍將在 .NET 5 中采用回溯,因此開發人員仍然需要謹慎運行不可信的正則表達式。)

Regex.* 靜態方法和并發

Regex類同時公開實例方法和靜態方法。靜態方法主要是為了方便起見,因為它們仍然需要在Regex實例上使用和操作。每次使用這些靜態方法之一時,該實現都可以實例化一個新的Regex并經歷完整的解析/優化/代碼生成例程,但是在某些情況下,這將浪費大量的時間和空間。相反,Regex會保留最近使用的Regex對象的緩存,并按使它們唯一的所有內容(例如,模式,RegexOptions甚至在CurrentCulture下(因為這可能會影響IgnoreCase匹配)。此緩存的大小受到限制,以Regex.CacheSize為上限,因此該實現采用了最近最少使用的(LRU)緩存:當緩存已滿并且需要添加另一個Regex時,實現將丟棄最近最少使用的項。緩存。

實現這種LRU緩存的一種簡單方法是使用鏈接列表:每次訪問某項時,它都會從列表中刪除并重新添加到最前面。但是,這種方法有一個很大的缺點,尤其是在并發世界中:同步。如果每次讀取實際上都是一個突變,則我們需要確保并發讀取(并發突變)不會破壞列表。這樣的列表正是.NET早期版本所采用的列表,并且使用了全局鎖來保護它。在.NET Core 2.1中,社區成員提交的一項不錯的更改通過允許訪問最近使用的無鎖項在某些情況下對此進行了改進,從而提高了通過靜態使用相同Regex的工作負載的吞吐量和可伸縮性。方法反復。但是,對于其他情況,實現仍然鎖定在每種用法上。

通過查看諸如Concurrency Visualizer之類的工具,可以看到此鎖定的影響,該工具是Visual Studio的擴展,可在其擴展程序庫中使用。通過在分析器下運行這樣的示例應用程序:

Copyusing System.Text.RegularExpressions; using System.Threading.Tasks;class Program {static void Main(){Parallel.Invoke(() => { while (true) Regex.IsMatch("abc", "^abc$"); },() => { while (true) Regex.IsMatch("def", "^def$"); },() => { while (true) Regex.IsMatch("ghi", "^ghi$"); },() => { while (true) Regex.IsMatch("jkl", "^jkl$"); });} }

我們可以看到這樣的圖像:

每行都是一個線程,它是此Parallel.Invoke的一部分。綠色區域是線程實際執行代碼的時間。黃色區域表示操作系統已搶占該線程的原因,因為該線程需要內核運行另一個線程。紅色區域表示線程被阻止等待某物。在這種情況下,所有紅色是因為線程正在等待Regex緩存中的共享全局鎖。

在.NET 5中,圖片看起來像這樣:

注意,沒有更多的紅色部分。這是因為緩存已被重寫為完全無鎖的讀取;唯一獲得鎖的時間是將新的Regex添加到緩存中,但是即使發生這種情況,其他線程也可以繼續從緩存中讀取實例并使用它們。這意味著,只要為應用程序及其常規使用的Regex靜態方法正確調整Regex.CacheSize的大小,此類訪問將不再招致它們過去的延遲。到今天為止,該值默認為15,但是該屬性具有設置器,因此可以對其進行更改以更好地滿足應用程序的需求。

靜態方法的分配也得到了改進,方法是精確地更改緩存內容,從而避免分配不必要的包裝對象。我們可以通過上一個示例的修改版本看到這一點:

Copyusing System.Text.RegularExpressions; using System.Threading.Tasks;class Program {static void Main(){Parallel.Invoke(() => { for (int i = 0; i < 10_000; i++) Regex.IsMatch("abc", "^abc$"); },() => { for (int i = 0; i < 10_000; i++) Regex.IsMatch("def", "^def$"); },() => { for (int i = 0; i < 10_000; i++) Regex.IsMatch("ghi", "^ghi$"); },() => { for (int i = 0; i < 10_000; i++) Regex.IsMatch("jkl", "^jkl$"); });} }

使用Visual Studio中的.NET對象分配跟蹤工具運行它。左邊是.NET Core 3.1,右邊是.NET 5 Preview 2:

特別要注意的是,左側包含40,000個分配的行,而右側只有4個。

其他開銷減少

我們已經介紹了.NET 5中對正則表達式進行的一些關鍵改進,但該列表絕不是完整的。到處都有一些較小的優化清單,盡管我們不能在這里列舉所有的優化清單,但我們可以逐步介紹更多。

在某些地方,我們已經采用了前面討論過的矢量化形式。例如,當使用RegexOptions.Compiled且該模式包含一個字符串字符串時,編譯器將分別檢查每個字符。如果查看諸如abcd之類的表達式的反編譯代碼,就會看到以下內容:

if (4 <= runtextend - runtextpos &&runtext[runtextpos] == 'a' &&runtext[runtextpos + 1] == 'b' &&runtext[runtextpos + 2] == 'c' &&runtext[runtextpos + 3] == 'd')

在.NET 5中,當使用DynamicMethod創建編譯后的代碼時,我們現在嘗試比較Int64值(在64位系統上,或在32位系統上比較Int32),而不是比較單個字符。這意味著對于上一個示例,我們現在改為生成與此類似的代碼:

if (3u < (uint)readOnlySpan.Length && *(long*)readOnlySpan._pointer == 28147922879250529L)

(我說“類似”,因為我們無法在C#中表示生成的確切IL,這與使用Unsafe類型的成員更加一致。)我們這里不必擔心字節順序問題,因為生成用于比較的Int64/Int32值的代碼與加載用于比較的輸入值的同一臺計算機(甚至在同一進程中)發生。

另一個示例是先前在先前生成的代碼示例中實際顯示的內容,但已被掩蓋。在比較@"a\sb"表達式的輸出時,您可能之前已經注意到,以前的代碼包含對CheckTimeout()的調用,但是新代碼沒有。此CheckTimeout()函數用于檢查我們的執行時間是否超過了Regex構造時提供給其的超時值所允許的時間。但是,在沒有提供超時的情況下使用的默認超時是“無限”,因此“無限”是非常常見的值。由于我們永遠不會超過無限超時,因此當我們為RegexOptions.Compiled正則表達式編譯代碼時,我們會檢查超時,如果是無限超時,則跳過生成這些CheckTimeout()調用。

在其他地方也存在類似的優化。例如,默認情況下,Regex執行區分大小寫的比較。僅在指定RegexOptions.IgnoreCase的情況下(或者表達式本身包含執行不區分大小寫的匹配的指令)才使用不區分大小寫的比較,并且僅當使用不區分大小寫的比較時,我們才需要訪問CultureInfo.CurrentCulture以確定如何進行比較。此外,如果指定了RegexOptions.InvariantCulture,則我們也無需訪問CultureInfo.CurrentCulture,因為它將永遠不會使用。所有這些意味著,如果我們證明不再需要它,則可以避免生成訪問CultureInfo.CurrentCulture的代碼。最重要的是,我們可以通過發出對char.ToLowerInvariant而不是char.ToLower(CultureInfo.InvariantCulture)的調用來使RegexOptions.InvariantCulture更快,尤其是因為.NET 5中ToLowerInvariant也得到了改進(還有另一個示例,其中將Regex更改為使用其他框架功能時,只要我們改進這些已利用的功能,它就會隱式受益。

另一個有趣的更改是Regex.Replace和Regex.Split。這些方法被實現為對Regex.Match的封裝,將其功能分層。但是,這意味著每次找到匹配項時,我們都將退出掃描循環,逐步遍歷抽象的各個層次,在匹配項上執行工作,然后調回引擎,以正確的方式進行工作返回到掃描循環,依此類推。最重要的是,每個匹配項都需要創建一個新的Match對象。現在在.NET 5中,這些方法在內部使用了一個專用的基于回調的循環,這使我們能夠停留在嚴格的掃描循環中,并一遍又一遍地重用同一個Match對象(如果公開公開,這是不安全的,但是可以作為內部實施細節來完成)。在實現“替換”中使用的內存管理也已調整為專注于跟蹤要替換或不替換的輸入區域,而不是跟蹤每個單獨的字符。這樣做的最終結果可能對吞吐量和內存分配都產生相當大的影響,尤其是對于輸入量非常長且替換次數很少的輸入。

Copyusing BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using System.Linq; using System.Text.RegularExpressions;[MemoryDiagnoser] public class Program {static void Main(string[] args) => BenchmarkSwitcher.FromAssemblies(new[] { typeof(Program).Assembly }).Run(args);private Regex _regex = new Regex("a", RegexOptions.Compiled);private string _input = string.Concat(Enumerable.Repeat("abcdefghijklmnopqrstuvwxyz", 1_000_000));[Benchmark] public string Replace() => _regex.Replace(_input, "A"); } MethodToolchainMeanErrorStdDevRatioGen 0Gen 1Gen 2Allocated
Replace\master\corerun.exe93.79 ms1.120 ms0.935 ms0.4581.59 MB
Replace\netcore31\corerun.exe209.59 ms3.654 ms3.418 ms1.0033666.6667666.6667666.6667371.96 MB

看看效果

所有這些結合在一起,可以在各種基準上產生明顯更好的性能。為了說明這一點,我在網上搜索了正則表達式基準并進行了幾次測試。

mariomka/regex-benchmark的基準測試已經具有C#版本,因此簡單地編譯和運行這很容易:

Copyusing System; using System.IO; using System.Text.RegularExpressions; using System.Diagnostics;class Benchmark {static void Main(string[] args){if (args.Length != 1){Console.WriteLine("Usage: benchmark <filename>");Environment.Exit(1);}StreamReader reader = new System.IO.StreamReader(args[0]);string data = reader.ReadToEnd();// EmailBenchmark.Measure(data, @"[\w\.+-]+@[\w\.-]+\.[\w\.-]+");// URIBenchmark.Measure(data, @"[\w]+://[^/\s?#]+[^\s?#]+(?:\?[^\s#]*)?(?:#[^\s]*)?");// IPBenchmark.Measure(data, @"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9])");}static void Measure(string data, string pattern){Stopwatch stopwatch = Stopwatch.StartNew();MatchCollection matches = Regex.Matches(data, pattern, RegexOptions.Compiled);int count = matches.Count;stopwatch.Stop();Console.WriteLine(stopwatch.Elapsed.TotalMilliseconds.ToString("G", System.Globalization.CultureInfo.InvariantCulture) + " - " + count);} }

在我的機器上,這是使用.NET Core 3.1的控制臺輸出:

Copy966.9274 - 92 746.3963 - 5301 65.6778 - 5

以及使用.NET 5的控制臺輸出:

Copy274.3515 - 92 159.3629 - 5301 15.6075 - 5

破折號前的數字是執行時間,破折號后的數字是答案(因此,第二個數字保持不變是一件好事)。執行時間急劇下降:分別提高了3.5倍,4.6倍和4.2倍!

我還找到了?https://zherczeg.github.io/sljit/regex_perf.html,它具有各種基準,但沒有C#版本。?我將其轉換為Benchmark.NET測試:

Copyusing BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using System.IO; using System.Text.RegularExpressions;[MemoryDiagnoser] public class Program {static void Main(string[] args) => BenchmarkSwitcher.FromAssemblies(new[] { typeof(Program).Assembly }).Run(args);private static string s_input = File.ReadAllText(@"d:\mtent12.txt");private Regex _regex;[GlobalSetup]public void Setup() => _regex = new Regex(Pattern, RegexOptions.Compiled);[Params(@"Twain",@"(?i)Twain",@"[a-z]shing",@"Huck[a-zA-Z]+|Saw[a-zA-Z]+",@"\b\w+nn\b",@"[a-q][^u-z]{13}x",@"Tom|Sawyer|Huckleberry|Finn",@"(?i)Tom|Sawyer|Huckleberry|Finn",@".{0,2}(Tom|Sawyer|Huckleberry|Finn)",@".{2,4}(Tom|Sawyer|Huckleberry|Finn)",@"Tom.{10,25}river|river.{10,25}Tom",@"[a-zA-Z]+ing",@"\s[a-zA-Z]{0,12}ing\s",@"([A-Za-z]awyer|[A-Za-z]inn)\s")]public string Pattern { get; set; }[Benchmark] public bool IsMatch() => _regex.IsMatch(s_input); }

并對照該頁面提供的大約20MB文本文件輸入運行它,得到以下結果:

MethodToolchainPatternMeanRatio
IsMatch\master\corerun.exe(?i)T(…)Finn [31]12,703.08 ns0.32
IsMatch\netcore31\corerun.exe(?i)T(…)Finn [31]40,207.12 ns1.00
IsMatch\master\corerun.exe(?i)Twain159.81 ns0.84
IsMatch\netcore31\corerun.exe(?i)Twain189.49 ns1.00
IsMatch\master\corerun.exe([A-Z(…)nn)\s [29]6,903,345.70 ns0.10
IsMatch\netcore31\corerun.exe([A-Z(…)nn)\s [29]67,388,775.83 ns1.00
IsMatch\master\corerun.exe.{0,2(…)Finn) [35]1,311,160.79 ns0.68
IsMatch\netcore31\corerun.exe.{0,2(…)Finn) [35]1,942,021.93 ns1.00
IsMatch\master\corerun.exe.{2,4(…)Finn) [35]1,202,730.97 ns0.67
IsMatch\netcore31\corerun.exe.{2,4(…)Finn) [35]1,790,485.74 ns1.00
IsMatch\master\corerun.exeHuck[(…)A-Z]+ [26]282,030.24 ns0.01
IsMatch\netcore31\corerun.exeHuck[(…)A-Z]+ [26]19,908,290.62 ns1.00
IsMatch\master\corerun.exeTom.{(…)5}Tom [33]8,817,983.04 ns0.09
IsMatch\netcore31\corerun.exeTom.{(…)5}Tom [33]94,075,640.48 ns1.00
IsMatch\master\corerun.exeTomS(…)Finn [27]39,214.62 ns0.14
IsMatch\netcore31\corerun.exeTomS(…)Finn [27]281,452.38 ns1.00
IsMatch\master\corerun.exeTwain64.44 ns0.77
IsMatch\netcore31\corerun.exeTwain83.61 ns1.00
IsMatch\master\corerun.exe[a-q][^u-z]{13}x1,695.15 ns0.09
IsMatch\netcore31\corerun.exe[a-q][^u-z]{13}x19,412.31 ns1.00
IsMatch\master\corerun.exe[a-zA-Z]+ing3,042.12 ns0.31
IsMatch\netcore31\corerun.exe[a-zA-Z]+ing9,896.25 ns1.00
IsMatch\master\corerun.exe[a-z]shing28,212.30 ns0.24
IsMatch\netcore31\corerun.exe[a-z]shing117,954.06 ns1.00
IsMatch\master\corerun.exe\b\w+nn\b32,278,974.55 ns0.21
IsMatch\netcore31\corerun.exe\b\w+nn\b152,395,335.00 ns1.00
IsMatch\master\corerun.exe\s[a-(…)ing\s [21]1,181.86 ns0.23
IsMatch\netcore31\corerun.exe\s[a-(…)ing\s [21]5,161.79 ns1.00

這些比例中的一些非常有趣。

另一個是“The Computer Language Benchmarks Game”中的“ regex-redux”基準。在dotnet/performance回購中利用了此實現,因此我運行了該代碼:

MethodToolchainoptionsMeanErrorStdDevMedianMinMaxRatioRatioSDGen 0Gen 1Gen 2Allocated
RegexRedux_5\master\corerun.exeCompiled7.941 ms0.0661 ms0.0619 ms7.965 ms7.782 ms8.009 ms0.300.012.67 MB
RegexRedux_5\netcore31\corerun.exeCompiled26.311 ms0.5058 ms0.4731 ms26.368 ms25.310 ms27.198 ms1.000.001571.428612.19 MB

因此,在此基準上,.NET 5的吞吐量是.NET Core 3.1的3.3倍。

呼吁社區行動

我們希望您的反饋和貢獻有多種方式。

下載.NET 5 Preview 2并使用正則表達式進行嘗試。您看到可衡量的收益了嗎?如果是這樣,請告訴我們。如果沒有,也請告訴我們,以便我們共同努力,為您最有價值的表達方式改善效果。

是否有對您很重要的特定正則表達式?如果是這樣,請與我們分享;我們很樂意使用來自您的真實正則表達式,您的輸入數據以及相應的預期結果來擴展我們的測試套件,以幫助確保在對我們進行進一步改進時,不會退回對您而言重要的事情代碼庫。實際上,我們歡迎PR到dotnet/runtime來以這種方式擴展測試套件。您可以看到,除了成千上萬個綜合測試用例之外,Regex測試套件還包含大量示例,這些示例來自文檔,教程和實際應用程序。如果您認為應該在此處添加表達式,請提交PR。作為性能改進的一部分,我們已經更改了很多代碼,盡管我們一直在努力進行驗證,但是肯定會漏入一些錯誤。您對自己的重要表達的反饋將有助于您實現這一目標!

與 .NET 5中已經完成的工作一樣,我們還列出了可以探索的其他已知工作的清單,這些工作已編入dotnet/runtime#1349。我們將在這里歡迎其他建議,更歡迎在此處概述的一些想法的實際原型設計或產品化(通過適當的性能審查,測試等)。一些示例:

  • 改進自動添加原子組的循環。如本文所述,我們現在自動在多個位置插入原子組,我們可以檢測到它們可能有助于減少回溯,同時保持語義相同。我們知道,但是,我們的分析存在一些空白,填補這些空白非常好。例如,該實現現在將a*b+c更改為(?>a*)(?>b+)c,因為它將看到b+不會提供任何可以匹配c的東西,而a*不會給出可以匹配b的任何東西(b+表示必須至少有一個b)。但是,即使后者合適,表達式a*b*c也會轉換為a*(?>b*)c而不是(?>a*)(?>b*)c。這里的問題是,我們目前僅查看序列中的下一個節點,并且b*可能匹配零項,這意味著a*之后的下一個節點可能是c,而我們目前的眼光并不那么遠。

  • 改進原子基團自動交替添加的功能。根據對交替的分析,我們可以做更多的工作來將交替自動升級為原子。例如,給定類似(Bonjour|Hello), .*的表達式,我們知道,如果Bonjour匹配,則Hello也不可能匹配,因此可以將這種替換設置為原子的。

  • 改善IndexOfAny的向量化。如本文所述,我們現在盡可能使用內置函數,這樣對這些表達式的改進也將使Regex受益(除了使用它們的所有其他工作負載)。現在,我們在某些正則表達式中對IndexOfAny的依賴度很高,以至于它可以代表處理的很大一部分,例如在前面顯示的“ regex redux”基準上,約有30%的時間花費在IndexOfAny上。這里有機會改進此功能,從而也改進Regex。這由?dotnet/runtime#25023?單獨引入。

  • 制作DFA實現原型。.NET正則表達式支持的某些方面很難使用基于DFA的正則表達式引擎來完成,但是某些操作應該是可以實現的,而不必擔心。例如,Regex.IsMatch不必關心捕獲語義(.NET在捕獲方面有一些額外的功能,這使其比其他實現更具挑戰性),因此,如果該表達式不包含諸如反向引用之類的問題構造,或環顧四周,對于IsMatch,我們可以探索使用基于DFA的引擎,并且有可能隨著時間的推移而得到更廣泛的使用。

  • 改善測試。如果您對測試的興趣超過對實施的興趣,那么在這里也需要做一些有價值的事情。我們的代碼覆蓋率已經很高,但是仍然存在差距。插入這些代碼(并可能在該過程中找到無效代碼)將很有幫助。查找并合并其他經過適當許可的測試套件以提供更多涵蓋各種表達式的內容也很有價值。

謝謝閱讀,翻譯自?Regex Performance Improvements in .NET 5

總結

以上是生活随笔為你收集整理的.NET 5 中的正则引擎性能改进(翻译)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

色狠狠av一区二区三区 | 美女黄网站人色视频免费国产 | 黑人巨大精品欧美黑寡妇 | 亚洲成av人在线观看网址 | 永久黄网站色视频免费直播 | 午夜精品一区二区三区的区别 | 人妻少妇精品无码专区二区 | 中文字幕无码免费久久99 | 亚洲男女内射在线播放 | 亚洲国产欧美日韩精品一区二区三区 | 婷婷色婷婷开心五月四房播播 | 高清不卡一区二区三区 | 九一九色国产 | 妺妺窝人体色www婷婷 | 男女超爽视频免费播放 | 欧美自拍另类欧美综合图片区 | 亚洲小说春色综合另类 | 一个人免费观看的www视频 | 人妻无码αv中文字幕久久琪琪布 | 性史性农村dvd毛片 | 亚洲精品午夜无码电影网 | 国产超碰人人爽人人做人人添 | 天堂а√在线中文在线 | 国产成人无码一二三区视频 | 亚洲中文无码av永久不收费 | 免费人成在线视频无码 | 人妻互换免费中文字幕 | 日本xxxx色视频在线观看免费 | 成人女人看片免费视频放人 | 熟妇人妻激情偷爽文 | 欧美精品无码一区二区三区 | 色狠狠av一区二区三区 | 免费乱码人妻系列无码专区 | 5858s亚洲色大成网站www | 97色伦图片97综合影院 | 国产激情综合五月久久 | 熟女少妇人妻中文字幕 | 亚洲色欲色欲天天天www | 玩弄人妻少妇500系列视频 | 99久久人妻精品免费二区 | 欧美精品国产综合久久 | 玩弄少妇高潮ⅹxxxyw | 日韩精品久久久肉伦网站 | 国产午夜精品一区二区三区嫩草 | 亚洲天堂2017无码 | 免费人成在线观看网站 | 精品国产青草久久久久福利 | 国产激情综合五月久久 | 精品无码av一区二区三区 | 精品人妻人人做人人爽夜夜爽 | 国产精品va在线观看无码 | 国产精品美女久久久久av爽李琼 | 国产在线精品一区二区高清不卡 | 国内精品久久毛片一区二区 | 2020久久超碰国产精品最新 | 国产suv精品一区二区五 | 999久久久国产精品消防器材 | 亲嘴扒胸摸屁股激烈网站 | 国产人成高清在线视频99最全资源 | 成人一在线视频日韩国产 | 亚洲 a v无 码免 费 成 人 a v | 中文无码精品a∨在线观看不卡 | 久久久久久亚洲精品a片成人 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲天堂2017无码 | 东北女人啪啪对白 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产亚av手机在线观看 | 国产成人无码a区在线观看视频app | 乱码av麻豆丝袜熟女系列 | 亚洲日韩av一区二区三区中文 | 亚洲精品久久久久avwww潮水 | 亚洲日韩av一区二区三区中文 | 亚洲成a人一区二区三区 | 四虎国产精品一区二区 | 成人免费视频在线观看 | 亚洲欧美中文字幕5发布 | 99国产精品白浆在线观看免费 | 国产精品高潮呻吟av久久 | 成人无码视频在线观看网站 | 国产在线精品一区二区三区直播 | 无遮挡啪啪摇乳动态图 | 99久久久国产精品无码免费 | 一本一道久久综合久久 | 香蕉久久久久久av成人 | 无码人妻丰满熟妇区五十路百度 | 国产sm调教视频在线观看 | 四虎影视成人永久免费观看视频 | 亚洲aⅴ无码成人网站国产app | 精品一区二区不卡无码av | 色欲久久久天天天综合网精品 | 中文字幕无线码免费人妻 | 人妻互换免费中文字幕 | 国产精品资源一区二区 | 亚洲熟女一区二区三区 | 精品无码国产自产拍在线观看蜜 | 日本饥渴人妻欲求不满 | 亚洲精品一区国产 | 纯爱无遮挡h肉动漫在线播放 | 婷婷五月综合激情中文字幕 | 欧美精品在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲国产一区二区三区在线观看 | 性史性农村dvd毛片 | 亚洲国产精品无码一区二区三区 | 国产精品亚洲综合色区韩国 | 无码纯肉视频在线观看 | 国产成人精品一区二区在线小狼 | 野外少妇愉情中文字幕 | 久久国产精品精品国产色婷婷 | 国产在线精品一区二区高清不卡 | 亚洲日本va午夜在线电影 | 国产成人无码午夜视频在线观看 | 久久精品国产一区二区三区 | 丰满岳乱妇在线观看中字无码 | 国产偷抇久久精品a片69 | 亚洲精品综合一区二区三区在线 | 国产手机在线αⅴ片无码观看 | √8天堂资源地址中文在线 | 亚洲国产精品无码久久久久高潮 | 亚洲精品久久久久久久久久久 | 高潮毛片无遮挡高清免费 | 精品水蜜桃久久久久久久 | 18禁黄网站男男禁片免费观看 | 图片区 小说区 区 亚洲五月 | 欧美日本日韩 | 亚洲成色www久久网站 | 国产亚洲人成a在线v网站 | 久久久久久国产精品无码下载 | 日本大香伊一区二区三区 | 国产成人无码一二三区视频 | 领导边摸边吃奶边做爽在线观看 | 精品国产乱码久久久久乱码 | 日本欧美一区二区三区乱码 | 欧美freesex黑人又粗又大 | 欧美人与物videos另类 | 97资源共享在线视频 | 天堂亚洲免费视频 | 乱人伦人妻中文字幕无码久久网 | 牲交欧美兽交欧美 | 综合网日日天干夜夜久久 | 免费观看又污又黄的网站 | 强奷人妻日本中文字幕 | 欧美日韩一区二区综合 | a片在线免费观看 | 中国女人内谢69xxxxxa片 | 成熟女人特级毛片www免费 | 一二三四社区在线中文视频 | 午夜福利一区二区三区在线观看 | 人妻aⅴ无码一区二区三区 | 日日噜噜噜噜夜夜爽亚洲精品 | 日本精品高清一区二区 | 国产无遮挡又黄又爽免费视频 | 在线亚洲高清揄拍自拍一品区 | 欧美精品免费观看二区 | 蜜臀aⅴ国产精品久久久国产老师 | 中文字幕乱妇无码av在线 | 国产成人无码av片在线观看不卡 | 男女下面进入的视频免费午夜 | 国产亚洲人成在线播放 | 中文精品久久久久人妻不卡 | 久久久久亚洲精品中文字幕 | 精品亚洲韩国一区二区三区 | 国产精品永久免费视频 | 国产手机在线αⅴ片无码观看 | 亚洲gv猛男gv无码男同 | 日本va欧美va欧美va精品 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲国产av美女网站 | 在线亚洲高清揄拍自拍一品区 | 在线欧美精品一区二区三区 | 窝窝午夜理论片影院 | 久精品国产欧美亚洲色aⅴ大片 | 欧美亚洲国产一区二区三区 | 国产精品久久国产三级国 | 国产国产精品人在线视 | 亚洲天堂2017无码中文 | 少妇性俱乐部纵欲狂欢电影 | 亚洲综合精品香蕉久久网 | 欧美freesex黑人又粗又大 | 国产三级久久久精品麻豆三级 | 狠狠色色综合网站 | 久久国产精品偷任你爽任你 | 六月丁香婷婷色狠狠久久 | 蜜臀aⅴ国产精品久久久国产老师 | 久久久中文久久久无码 | 纯爱无遮挡h肉动漫在线播放 | 国产成人无码午夜视频在线观看 | 亚洲欧洲日本综合aⅴ在线 | 国产精华av午夜在线观看 | 亚洲乱码日产精品bd | 蜜臀aⅴ国产精品久久久国产老师 | 午夜精品一区二区三区在线观看 | 中文字幕无码免费久久9一区9 | 亚洲一区av无码专区在线观看 | 国产精品办公室沙发 | 色五月五月丁香亚洲综合网 | 97se亚洲精品一区 | 久久99精品国产麻豆 | 中文久久乱码一区二区 | 99久久精品午夜一区二区 | 久久亚洲精品中文字幕无男同 | 玩弄少妇高潮ⅹxxxyw | 狠狠躁日日躁夜夜躁2020 | 国语自产偷拍精品视频偷 | 亚洲gv猛男gv无码男同 | 成人精品天堂一区二区三区 | 国产av人人夜夜澡人人爽麻豆 | 性色欲网站人妻丰满中文久久不卡 | 免费无码一区二区三区蜜桃大 | 男女性色大片免费网站 | 中国女人内谢69xxxxxa片 | 免费看男女做好爽好硬视频 | 人妻天天爽夜夜爽一区二区 | 国产成人无码午夜视频在线观看 | 九月婷婷人人澡人人添人人爽 | 国产色视频一区二区三区 | 又黄又爽又色的视频 | 丰满少妇人妻久久久久久 | 天堂а√在线地址中文在线 | 在线观看国产一区二区三区 | 国产九九九九九九九a片 | 麻豆av传媒蜜桃天美传媒 | 日本精品少妇一区二区三区 | 日日摸天天摸爽爽狠狠97 | 欧美国产日韩久久mv | 亚洲大尺度无码无码专区 | 国内少妇偷人精品视频 | 日韩人妻无码中文字幕视频 | 亚洲a无码综合a国产av中文 | 精品成在人线av无码免费看 | 妺妺窝人体色www在线小说 | 伊在人天堂亚洲香蕉精品区 | 福利一区二区三区视频在线观看 | 成年美女黄网站色大免费视频 | 欧美性生交xxxxx久久久 | 免费观看的无遮挡av | 人妻无码久久精品人妻 | 成人片黄网站色大片免费观看 | 色一情一乱一伦一区二区三欧美 | 极品尤物被啪到呻吟喷水 | 九九久久精品国产免费看小说 | 精品国产麻豆免费人成网站 | 亚洲一区二区观看播放 | 水蜜桃av无码 | 十八禁真人啪啪免费网站 | 欧美黑人巨大xxxxx | 大乳丰满人妻中文字幕日本 | 国产区女主播在线观看 | 无码乱肉视频免费大全合集 | 国产精品成人av在线观看 | 88国产精品欧美一区二区三区 | 精品国产av色一区二区深夜久久 | 高清不卡一区二区三区 | 精品国产精品久久一区免费式 | 性生交大片免费看l | 成人精品天堂一区二区三区 | а天堂中文在线官网 | 999久久久国产精品消防器材 | 国产猛烈高潮尖叫视频免费 | 撕开奶罩揉吮奶头视频 | 久久久精品人妻久久影视 | 日本爽爽爽爽爽爽在线观看免 | 日韩精品a片一区二区三区妖精 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美日韩一区二区免费视频 | 九月婷婷人人澡人人添人人爽 | 亚洲人成网站免费播放 | 美女毛片一区二区三区四区 | 鲁鲁鲁爽爽爽在线视频观看 | 四虎国产精品免费久久 | 国产卡一卡二卡三 | 女人被男人躁得好爽免费视频 | 97夜夜澡人人双人人人喊 | 亚洲精品国产第一综合99久久 | 久久无码人妻影院 | 久久精品视频在线看15 | 中文精品久久久久人妻不卡 | 国产成人综合在线女婷五月99播放 | 性生交片免费无码看人 | 人人妻人人澡人人爽欧美精品 | 国产黄在线观看免费观看不卡 | 高潮毛片无遮挡高清免费 | 色五月五月丁香亚洲综合网 | 久久天天躁夜夜躁狠狠 | 成人欧美一区二区三区黑人免费 | 99久久无码一区人妻 | 久久精品国产日本波多野结衣 | 波多野42部无码喷潮在线 | 国产精品国产自线拍免费软件 | 国产国产精品人在线视 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 久久精品人人做人人综合 | 成人女人看片免费视频放人 | 亚洲爆乳无码专区 | 国产三级精品三级男人的天堂 | 麻豆国产97在线 | 欧洲 | 波多野结衣aⅴ在线 | 丰满岳乱妇在线观看中字无码 | 精品国产一区二区三区四区在线看 | 东京热一精品无码av | 好爽又高潮了毛片免费下载 | 国内少妇偷人精品视频 | 成人片黄网站色大片免费观看 | 亚洲色无码一区二区三区 | 欧美xxxx黑人又粗又长 | 一区二区传媒有限公司 | 久久午夜夜伦鲁鲁片无码免费 | 免费无码肉片在线观看 | 亚洲成a人片在线观看无码3d | 1000部啪啪未满十八勿入下载 | 性色av无码免费一区二区三区 | 中文字幕av日韩精品一区二区 | 亚洲乱码中文字幕在线 | 免费国产黄网站在线观看 | 天堂亚洲2017在线观看 | 少妇被粗大的猛进出69影院 | 人妻与老人中文字幕 | 国产亚洲人成a在线v网站 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 樱花草在线播放免费中文 | 又色又爽又黄的美女裸体网站 | 日韩人妻无码一区二区三区久久99 | 狂野欧美性猛xxxx乱大交 | 亚洲综合色区中文字幕 | 麻豆国产人妻欲求不满 | 人妻无码久久精品人妻 | 少妇被粗大的猛进出69影院 | 精品人妻人人做人人爽 | 亚洲一区二区三区国产精华液 | 97夜夜澡人人爽人人喊中国片 | 国产免费无码一区二区视频 | 久久国产精品偷任你爽任你 | 97无码免费人妻超级碰碰夜夜 | 青草青草久热国产精品 | 性欧美熟妇videofreesex | 狂野欧美激情性xxxx | 少妇无码吹潮 | 国产精品va在线观看无码 | 国产精品久久精品三级 | 久久综合香蕉国产蜜臀av | 欧美午夜特黄aaaaaa片 | 露脸叫床粗话东北少妇 | 久久久久久久女国产乱让韩 | 中文字幕人妻丝袜二区 | 国产成人综合色在线观看网站 | 国产真实乱对白精彩久久 | 欧美第一黄网免费网站 | 一本久久伊人热热精品中文字幕 | 亚洲另类伦春色综合小说 | 天天拍夜夜添久久精品大 | 人妻少妇精品无码专区动漫 | 国产av剧情md精品麻豆 | 国产免费久久久久久无码 | 久久久精品456亚洲影院 | 国产99久久精品一区二区 | 午夜成人1000部免费视频 | 国产精品18久久久久久麻辣 | 国内揄拍国内精品少妇国语 | 国产乱人伦av在线无码 | 国产精品18久久久久久麻辣 | 蜜桃视频韩日免费播放 | 国产乡下妇女做爰 | 国产无遮挡又黄又爽又色 | 夜夜影院未满十八勿进 | 久久精品一区二区三区四区 | 日韩精品一区二区av在线 | 国内少妇偷人精品视频免费 | 国产无套内射久久久国产 | 婷婷丁香五月天综合东京热 | 国产精品.xx视频.xxtv | 午夜福利一区二区三区在线观看 | 精品无码av一区二区三区 | 国产办公室秘书无码精品99 | 欧美自拍另类欧美综合图片区 | 亚洲狠狠色丁香婷婷综合 | 在线а√天堂中文官网 | 午夜免费福利小电影 | 岛国片人妻三上悠亚 | 麻豆国产97在线 | 欧洲 | 乌克兰少妇xxxx做受 | 国产精品无码mv在线观看 | 日韩欧美成人免费观看 | аⅴ资源天堂资源库在线 | 综合网日日天干夜夜久久 | 成人欧美一区二区三区 | 久久午夜夜伦鲁鲁片无码免费 | 日日鲁鲁鲁夜夜爽爽狠狠 | 99视频精品全部免费免费观看 | 特级做a爰片毛片免费69 | 亚洲国产一区二区三区在线观看 | 性欧美疯狂xxxxbbbb | 国产福利视频一区二区 | 亚洲日韩av一区二区三区中文 | 377p欧洲日本亚洲大胆 | 精品久久久久久人妻无码中文字幕 | 精品亚洲成av人在线观看 | 国产成人综合美国十次 | 亚洲综合色区中文字幕 | 国产av无码专区亚洲a∨毛片 | 久久久久成人片免费观看蜜芽 | 2020最新国产自产精品 | 日韩欧美中文字幕公布 | 牲欲强的熟妇农村老妇女 | 97精品国产97久久久久久免费 | 国产人妖乱国产精品人妖 | 日本大香伊一区二区三区 | 人妻体内射精一区二区三四 | 日本精品久久久久中文字幕 | 国产人妻人伦精品1国产丝袜 | 青青草原综合久久大伊人精品 | 久久亚洲精品中文字幕无男同 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲第一无码av无码专区 | 亚洲一区二区三区在线观看网站 | 国产色视频一区二区三区 | 久久精品无码一区二区三区 | 对白脏话肉麻粗话av | 国产性生大片免费观看性 | 亚洲精品美女久久久久久久 | 国产精品久久久久久亚洲毛片 | 精品人妻人人做人人爽夜夜爽 | 人人妻人人澡人人爽欧美一区九九 | 久久 国产 尿 小便 嘘嘘 | 天下第一社区视频www日本 | 极品尤物被啪到呻吟喷水 | 人人超人人超碰超国产 | 无码人妻少妇伦在线电影 | 正在播放东北夫妻内射 | 久久99精品久久久久婷婷 | 性色欲情网站iwww九文堂 | 国产情侣作爱视频免费观看 | 亚洲国产精品成人久久蜜臀 | 亚洲码国产精品高潮在线 | 三级4级全黄60分钟 | 呦交小u女精品视频 | 久久午夜无码鲁丝片 | 国产三级久久久精品麻豆三级 | 精品国偷自产在线 | 午夜男女很黄的视频 | 国精产品一品二品国精品69xx | 99riav国产精品视频 | 国产精品毛片一区二区 | 精品无人区无码乱码毛片国产 | 亚洲国产精品久久久久久 | 国产精品高潮呻吟av久久 | 欧美人与善在线com | 亚洲中文字幕无码中字 | 熟女少妇在线视频播放 | 2020久久超碰国产精品最新 | 久久精品国产一区二区三区 | 粗大的内捧猛烈进出视频 | 精品乱子伦一区二区三区 | 乱码午夜-极国产极内射 | 色妞www精品免费视频 | 精品成人av一区二区三区 | 欧美日韩人成综合在线播放 | 中文字幕久久久久人妻 | 2020久久超碰国产精品最新 | 免费无码的av片在线观看 | 国产午夜无码视频在线观看 | 免费观看又污又黄的网站 | 中文无码成人免费视频在线观看 | 国产激情一区二区三区 | 四十如虎的丰满熟妇啪啪 | 人人妻人人藻人人爽欧美一区 | 小sao货水好多真紧h无码视频 | 婷婷色婷婷开心五月四房播播 | 国产午夜手机精彩视频 | 两性色午夜视频免费播放 | 亚洲综合无码久久精品综合 | 成人亚洲精品久久久久软件 | 日本肉体xxxx裸交 | 国产精品无码mv在线观看 | 一个人看的视频www在线 | 国内精品久久毛片一区二区 | 国产精品无码永久免费888 | 狠狠综合久久久久综合网 | 国产偷国产偷精品高清尤物 | 日本饥渴人妻欲求不满 | 啦啦啦www在线观看免费视频 | 无码午夜成人1000部免费视频 | 国产欧美亚洲精品a | 国产人成高清在线视频99最全资源 | 国产人成高清在线视频99最全资源 | 300部国产真实乱 | 国产亚洲欧美日韩亚洲中文色 | 亚洲国产精品一区二区第一页 | 免费乱码人妻系列无码专区 | 国内老熟妇对白xxxxhd | 精品熟女少妇av免费观看 | 国产一区二区三区影院 | 久久久精品人妻久久影视 | 精品一区二区三区无码免费视频 | 亚洲色大成网站www国产 | 国产成人一区二区三区在线观看 | 欧美日韩视频无码一区二区三 | 午夜精品一区二区三区的区别 | 377p欧洲日本亚洲大胆 | 一个人看的视频www在线 | 性啪啪chinese东北女人 | 性做久久久久久久免费看 | 国产肉丝袜在线观看 | 国产精品无码一区二区桃花视频 | 国产香蕉97碰碰久久人人 | 久久久久久av无码免费看大片 | 又湿又紧又大又爽a视频国产 | 夫妻免费无码v看片 | 亚洲色成人中文字幕网站 | 欧美激情一区二区三区成人 | 少妇人妻偷人精品无码视频 | 亚洲精品午夜国产va久久成人 | 久久 国产 尿 小便 嘘嘘 | 国产卡一卡二卡三 | 国内精品人妻无码久久久影院蜜桃 | 又粗又大又硬毛片免费看 | 亚洲色欲色欲欲www在线 | 成人三级无码视频在线观看 | 欧美丰满少妇xxxx性 | 欧洲欧美人成视频在线 | 亚洲a无码综合a国产av中文 | 久久精品国产99精品亚洲 | 无码吃奶揉捏奶头高潮视频 | 日韩人妻少妇一区二区三区 | 女人被男人躁得好爽免费视频 | 狠狠躁日日躁夜夜躁2020 | 精品人人妻人人澡人人爽人人 | 午夜福利不卡在线视频 | 人妻aⅴ无码一区二区三区 | 国产97人人超碰caoprom | 性色av无码免费一区二区三区 | 国产亚洲精品久久久久久国模美 | 乱人伦中文视频在线观看 | 国产熟妇另类久久久久 | 精品成人av一区二区三区 | 欧美自拍另类欧美综合图片区 | 国产99久久精品一区二区 | 久久婷婷五月综合色国产香蕉 | 欧美三级a做爰在线观看 | 国产精品久久福利网站 | 人人爽人人爽人人片av亚洲 | 精品一区二区三区波多野结衣 | 久久久亚洲欧洲日产国码αv | 国产精品无套呻吟在线 | 人妻夜夜爽天天爽三区 | 成人精品一区二区三区中文字幕 | a在线亚洲男人的天堂 | 在线播放免费人成毛片乱码 | 沈阳熟女露脸对白视频 | 亚洲日韩av片在线观看 | 一二三四社区在线中文视频 | 亚洲精品国产品国语在线观看 | 色五月丁香五月综合五月 | 老熟妇乱子伦牲交视频 | 中文字幕人妻无码一夲道 | 午夜福利试看120秒体验区 | 国产国语老龄妇女a片 | 中文无码成人免费视频在线观看 | a国产一区二区免费入口 | 无码人中文字幕 | a片免费视频在线观看 | 久久精品99久久香蕉国产色戒 | 十八禁真人啪啪免费网站 | 精品欧美一区二区三区久久久 | 无码av免费一区二区三区试看 | 51国偷自产一区二区三区 | 亚洲精品国产品国语在线观看 | 亚洲男人av天堂午夜在 | 日本欧美一区二区三区乱码 | 亚洲色www成人永久网址 | 国产熟女一区二区三区四区五区 | 熟女少妇在线视频播放 | 精品久久久久久亚洲精品 | 中文字幕无码av波多野吉衣 | 国产精品久久久久9999小说 | 在线天堂新版最新版在线8 | 亚洲中文字幕va福利 | 国产性生交xxxxx无码 | 日产精品高潮呻吟av久久 | av在线亚洲欧洲日产一区二区 | 国产精品欧美成人 | 亚洲人成网站免费播放 | 少妇性荡欲午夜性开放视频剧场 | 又黄又爽又色的视频 | 一本大道伊人av久久综合 | 免费观看的无遮挡av | 色综合视频一区二区三区 | 久久久www成人免费毛片 | 久久久久成人片免费观看蜜芽 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲精品国产精品乱码视色 | 日本va欧美va欧美va精品 | 国产成人亚洲综合无码 | 亚洲乱码中文字幕在线 | 国产成人亚洲综合无码 | 国产成人精品必看 | 亚洲精品欧美二区三区中文字幕 | 久久99精品久久久久久动态图 | 亚洲精品中文字幕乱码 | 成人aaa片一区国产精品 | 亚洲小说春色综合另类 | 午夜肉伦伦影院 | 免费国产成人高清在线观看网站 | 亚洲色在线无码国产精品不卡 | 亚洲成色在线综合网站 | 精品无码一区二区三区爱欲 | 国精品人妻无码一区二区三区蜜柚 | 夜夜躁日日躁狠狠久久av | 双乳奶水饱满少妇呻吟 | 国产精品毛多多水多 | 欧美国产日韩亚洲中文 | 老熟妇乱子伦牲交视频 | 影音先锋中文字幕无码 | 乱人伦人妻中文字幕无码久久网 | 精品人妻中文字幕有码在线 | 中文字幕人妻无码一夲道 | 日产精品高潮呻吟av久久 | 国产免费无码一区二区视频 | 中文字幕亚洲情99在线 | 国产成人无码午夜视频在线观看 | 久久亚洲精品成人无码 | 亚洲熟妇色xxxxx欧美老妇 | 欧美日韩综合一区二区三区 | 国产猛烈高潮尖叫视频免费 | 最近中文2019字幕第二页 | 欧美日韩在线亚洲综合国产人 | 97资源共享在线视频 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲小说图区综合在线 | 亚洲一区二区三区四区 | 俄罗斯老熟妇色xxxx | www成人国产高清内射 | 国模大胆一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 天天躁日日躁狠狠躁免费麻豆 | 嫩b人妻精品一区二区三区 | 精品久久久久久人妻无码中文字幕 | 国产无遮挡又黄又爽又色 | 国产特级毛片aaaaaa高潮流水 | 樱花草在线播放免费中文 | 国产特级毛片aaaaaaa高清 | 欧美熟妇另类久久久久久多毛 | 午夜不卡av免费 一本久久a久久精品vr综合 | 国产精品怡红院永久免费 | 午夜无码区在线观看 | 国产超碰人人爽人人做人人添 | 久久精品成人欧美大片 | 亚洲国产精品久久人人爱 | 国产凸凹视频一区二区 | 夫妻免费无码v看片 | 亚洲 另类 在线 欧美 制服 | 荫蒂添的好舒服视频囗交 | 夜夜躁日日躁狠狠久久av | 亚洲中文字幕无码一久久区 | 大乳丰满人妻中文字幕日本 | 少女韩国电视剧在线观看完整 | 性色欲情网站iwww九文堂 | 亚洲成av人片在线观看无码不卡 | 2019nv天堂香蕉在线观看 | 日韩少妇白浆无码系列 | 玩弄中年熟妇正在播放 | 美女毛片一区二区三区四区 | 精品少妇爆乳无码av无码专区 | 国产超碰人人爽人人做人人添 | 亚洲 日韩 欧美 成人 在线观看 | 丰满人妻一区二区三区免费视频 | 欧美色就是色 | 一本色道久久综合狠狠躁 | 国产美女精品一区二区三区 | 97se亚洲精品一区 | 日韩人妻无码一区二区三区久久99 | ass日本丰满熟妇pics | 奇米影视888欧美在线观看 | 久久精品国产99久久6动漫 | 欧美日韩久久久精品a片 | av无码电影一区二区三区 | 国产舌乚八伦偷品w中 | 国产69精品久久久久app下载 | 国产超级va在线观看视频 | 波多野结衣av一区二区全免费观看 | 婷婷综合久久中文字幕蜜桃三电影 | 思思久久99热只有频精品66 | 一本久道久久综合婷婷五月 | 日韩精品乱码av一区二区 | 强奷人妻日本中文字幕 | 国产后入清纯学生妹 | 亚洲成av人影院在线观看 | 久久精品国产一区二区三区肥胖 | 免费国产成人高清在线观看网站 | 国产尤物精品视频 | 亚洲自偷自偷在线制服 | 免费中文字幕日韩欧美 | 国产一区二区不卡老阿姨 | 男女爱爱好爽视频免费看 | 国产情侣作爱视频免费观看 | 精品国产一区av天美传媒 | 性欧美videos高清精品 | 黑人粗大猛烈进出高潮视频 | 成人无码影片精品久久久 | 真人与拘做受免费视频 | 国产真实夫妇视频 | 国产精品久久国产三级国 | 免费网站看v片在线18禁无码 | 国内揄拍国内精品少妇国语 | 久久无码中文字幕免费影院蜜桃 | 中文字幕精品av一区二区五区 | 久久精品人人做人人综合试看 | 精品亚洲成av人在线观看 | 精品国产青草久久久久福利 | 99久久久无码国产aaa精品 | 大胆欧美熟妇xx | 国产乱子伦视频在线播放 | 久久精品人妻少妇一区二区三区 | 亚洲一区二区三区香蕉 | 亚洲欧美综合区丁香五月小说 | 国产亚av手机在线观看 | 亚洲春色在线视频 | 天天躁夜夜躁狠狠是什么心态 | 国产在线aaa片一区二区99 | 无码av中文字幕免费放 | 亚洲一区二区三区在线观看网站 | 成人性做爰aaa片免费看不忠 | 乱人伦人妻中文字幕无码 | 精品无码av一区二区三区 | 99riav国产精品视频 | 人人爽人人爽人人片av亚洲 | 亚洲人成影院在线无码按摩店 | 亚洲精品久久久久久一区二区 | √天堂资源地址中文在线 | 网友自拍区视频精品 | 5858s亚洲色大成网站www | 少妇太爽了在线观看 | 内射爽无广熟女亚洲 | av无码不卡在线观看免费 | 亚洲精品无码人妻无码 | 亚洲欧洲日本无在线码 | 午夜精品一区二区三区的区别 | 国产av一区二区精品久久凹凸 | 成人毛片一区二区 | 捆绑白丝粉色jk震动捧喷白浆 | 久久精品99久久香蕉国产色戒 | 蜜臀av在线播放 久久综合激激的五月天 | 永久免费观看美女裸体的网站 | 日本爽爽爽爽爽爽在线观看免 | 人人妻人人澡人人爽人人精品浪潮 | 久久精品国产一区二区三区肥胖 | 日本又色又爽又黄的a片18禁 | 扒开双腿吃奶呻吟做受视频 | 丰满人妻一区二区三区免费视频 | 婷婷综合久久中文字幕蜜桃三电影 | 欧美 丝袜 自拍 制服 另类 | 国产偷抇久久精品a片69 | 亚洲国产精品无码久久久久高潮 | 久久久国产一区二区三区 | 久久综合网欧美色妞网 | 国产精品毛多多水多 | 亚洲国产日韩a在线播放 | 亚洲天堂2017无码中文 | 青草视频在线播放 | 97se亚洲精品一区 | 老熟女重囗味hdxx69 | 久久精品国产一区二区三区 | 无遮挡国产高潮视频免费观看 | 亚洲国产欧美日韩精品一区二区三区 | 熟女俱乐部五十路六十路av | 国产精品理论片在线观看 | 色情久久久av熟女人妻网站 | 久久精品一区二区三区四区 | 曰韩少妇内射免费播放 | 久久精品成人欧美大片 | 在线看片无码永久免费视频 | 日本护士毛茸茸高潮 | 精品一区二区三区波多野结衣 | 色欲久久久天天天综合网精品 | 精品一区二区三区无码免费视频 | 亚洲男人av香蕉爽爽爽爽 | 77777熟女视频在线观看 а天堂中文在线官网 | 动漫av网站免费观看 | 乱码av麻豆丝袜熟女系列 | 日本www一道久久久免费榴莲 | 久久久久人妻一区精品色欧美 | 欧美午夜特黄aaaaaa片 | 国产精品二区一区二区aⅴ污介绍 | 国产成人综合在线女婷五月99播放 | 国产精品无码一区二区三区不卡 | 国产亚洲精品精品国产亚洲综合 | 亚洲欧洲无卡二区视頻 | 国产精品无码久久av | 天堂无码人妻精品一区二区三区 | 国产精品.xx视频.xxtv | 综合人妻久久一区二区精品 | 又粗又大又硬又长又爽 | 国产精品福利视频导航 | 免费乱码人妻系列无码专区 | 中文字幕无码日韩专区 | 久久精品丝袜高跟鞋 | 亚洲日韩av片在线观看 | 久久综合香蕉国产蜜臀av | 麻豆果冻传媒2021精品传媒一区下载 | 久久久久人妻一区精品色欧美 | 国产精品无套呻吟在线 | 玩弄少妇高潮ⅹxxxyw | 日本大香伊一区二区三区 | 免费观看激色视频网站 | 中文字幕乱妇无码av在线 | 国产香蕉尹人视频在线 | 一本久道高清无码视频 | 欧美精品无码一区二区三区 | 精品无码国产自产拍在线观看蜜 | 人妻少妇精品无码专区二区 | 国产成人午夜福利在线播放 | 成 人 网 站国产免费观看 | 欧美日韩视频无码一区二区三 | 国产无遮挡又黄又爽免费视频 | 精品一二三区久久aaa片 | 国产精品美女久久久久av爽李琼 | 一区二区三区乱码在线 | 欧洲 | 久久精品无码一区二区三区 | 久久久久成人精品免费播放动漫 | 欧美乱妇无乱码大黄a片 | 人人妻人人澡人人爽人人精品 | 国产色视频一区二区三区 | 女人色极品影院 | 国产精品18久久久久久麻辣 | 国产精品久久久久久亚洲毛片 | www国产亚洲精品久久久日本 | 桃花色综合影院 | 色综合久久88色综合天天 | 男女超爽视频免费播放 | 亚洲精品无码国产 | 成人试看120秒体验区 | 日欧一片内射va在线影院 | 国产在线aaa片一区二区99 | 成人一在线视频日韩国产 | 国产人妻久久精品二区三区老狼 | 久久天天躁狠狠躁夜夜免费观看 | 88国产精品欧美一区二区三区 | 免费无码的av片在线观看 | 亚洲精品久久久久久一区二区 | 特级做a爰片毛片免费69 | 久久综合给久久狠狠97色 | 在线成人www免费观看视频 | 窝窝午夜理论片影院 | 波多野结衣av在线观看 | 亚洲伊人久久精品影院 | 色老头在线一区二区三区 | 欧美高清在线精品一区 | 国产精品久久久久久亚洲影视内衣 | 亚洲色欲久久久综合网东京热 | 国产乱人偷精品人妻a片 | 精品午夜福利在线观看 | 98国产精品综合一区二区三区 | 免费人成在线视频无码 | 奇米影视888欧美在线观看 | 综合人妻久久一区二区精品 | 天天躁日日躁狠狠躁免费麻豆 | 久久综合色之久久综合 | 久久午夜无码鲁丝片午夜精品 | 久久久成人毛片无码 | 亚洲熟熟妇xxxx | 精品国产精品久久一区免费式 | 国产口爆吞精在线视频 | 俺去俺来也www色官网 | 亚洲日韩av一区二区三区四区 | 亚洲无人区一区二区三区 | 伊人久久大香线焦av综合影院 | 国产人妻人伦精品 | 中文精品无码中文字幕无码专区 | 国产后入清纯学生妹 | 色综合久久久无码网中文 | 少妇性俱乐部纵欲狂欢电影 | 亚洲国产精品无码久久久久高潮 | 日本一卡2卡3卡四卡精品网站 | 免费看少妇作爱视频 | 青青青手机频在线观看 | 国产成人一区二区三区在线观看 | 精品无码av一区二区三区 | 亚洲の无码国产の无码影院 | 中文字幕乱码亚洲无线三区 | 亚洲日韩精品欧美一区二区 | 久久国语露脸国产精品电影 | 国产真实夫妇视频 | 中文无码伦av中文字幕 | 黑人巨大精品欧美一区二区 | 亚洲色无码一区二区三区 | 伊人色综合久久天天小片 | 久久国内精品自在自线 | 啦啦啦www在线观看免费视频 | 扒开双腿吃奶呻吟做受视频 | 国内精品人妻无码久久久影院 | 人人妻在人人 | 亚洲天堂2017无码中文 | 无码人妻黑人中文字幕 | 免费观看黄网站 | 免费观看又污又黄的网站 | 国产猛烈高潮尖叫视频免费 | 黑人大群体交免费视频 | 少妇性l交大片 | 国产人妻精品一区二区三区 | 欧美精品在线观看 | 天天躁夜夜躁狠狠是什么心态 | 国产成人无码午夜视频在线观看 | 亚洲一区二区三区含羞草 | 性生交大片免费看l | 亚洲综合色区中文字幕 | 18禁黄网站男男禁片免费观看 | √天堂中文官网8在线 | 亚洲熟悉妇女xxx妇女av | 一本久道高清无码视频 | 精品国产成人一区二区三区 | 亚洲成av人综合在线观看 | 无遮挡啪啪摇乳动态图 | 综合网日日天干夜夜久久 | 十八禁视频网站在线观看 | 天天综合网天天综合色 | 中文精品久久久久人妻不卡 | 久久久www成人免费毛片 | 国产av无码专区亚洲a∨毛片 | 亚洲熟妇色xxxxx亚洲 | 国产精品亚洲а∨无码播放麻豆 | aⅴ亚洲 日韩 色 图网站 播放 | 一区二区三区乱码在线 | 欧洲 | 蜜桃臀无码内射一区二区三区 | 欧美黑人乱大交 | 久久99精品国产.久久久久 | 久久精品成人欧美大片 | a国产一区二区免费入口 | 亚洲 激情 小说 另类 欧美 | 青青草原综合久久大伊人精品 | 伊人久久大香线蕉亚洲 | 国产高清不卡无码视频 | 天堂亚洲免费视频 | 人人爽人人澡人人人妻 | 中文字幕无码视频专区 | 高清无码午夜福利视频 | 人妻aⅴ无码一区二区三区 | 欧美怡红院免费全部视频 | 亚洲爆乳无码专区 | 亚洲va欧美va天堂v国产综合 | 亚洲爆乳精品无码一区二区三区 | 国产色在线 | 国产 | 97资源共享在线视频 | 麻豆成人精品国产免费 | 一个人看的视频www在线 | 久久精品人人做人人综合试看 | 性欧美videos高清精品 | 领导边摸边吃奶边做爽在线观看 | 两性色午夜视频免费播放 | 综合激情五月综合激情五月激情1 | 无遮无挡爽爽免费视频 | 精品乱码久久久久久久 | 东北女人啪啪对白 | 久久熟妇人妻午夜寂寞影院 | 欧美人与牲动交xxxx | 天天躁夜夜躁狠狠是什么心态 | 欧美性生交活xxxxxdddd | 国产亚洲精品久久久久久久久动漫 | 亚洲午夜无码久久 | 初尝人妻少妇中文字幕 | 欧美35页视频在线观看 | 国产精华av午夜在线观看 | 伊人久久大香线蕉亚洲 | 日韩精品a片一区二区三区妖精 | 亚洲伊人久久精品影院 | 亚洲国产欧美国产综合一区 | 撕开奶罩揉吮奶头视频 | 成人欧美一区二区三区 | 午夜精品一区二区三区的区别 | 在教室伦流澡到高潮hnp视频 | 搡女人真爽免费视频大全 | 国产绳艺sm调教室论坛 | 成人无码视频在线观看网站 | 精品国偷自产在线视频 | 自拍偷自拍亚洲精品10p | 国产精品嫩草久久久久 | 精品国产av色一区二区深夜久久 | 人人妻人人澡人人爽人人精品浪潮 | 欧美高清在线精品一区 | 波多野结衣高清一区二区三区 | 精品国产aⅴ无码一区二区 | 国内精品久久久久久中文字幕 | 久青草影院在线观看国产 | 无码中文字幕色专区 | 少妇太爽了在线观看 | 色一情一乱一伦一视频免费看 | 精品欧美一区二区三区久久久 | 国产精品久久国产精品99 | 娇妻被黑人粗大高潮白浆 | 狂野欧美激情性xxxx | 女人被男人爽到呻吟的视频 | 性开放的女人aaa片 | 久久精品99久久香蕉国产色戒 | 精品久久久久久人妻无码中文字幕 | 亚洲日本在线电影 | 色综合视频一区二区三区 | 亚洲欧美中文字幕5发布 | 成在人线av无码免观看麻豆 | 300部国产真实乱 | 日韩av无码一区二区三区不卡 | 天堂а√在线中文在线 | 丝袜美腿亚洲一区二区 | 国内精品人妻无码久久久影院蜜桃 | 日韩欧美中文字幕在线三区 | 性生交片免费无码看人 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 老熟妇仑乱视频一区二区 | 99精品国产综合久久久久五月天 | 内射老妇bbwx0c0ck | 久久久中文久久久无码 | 青青草原综合久久大伊人精品 | 亚洲日韩av一区二区三区中文 | 亚洲天堂2017无码中文 | 国产电影无码午夜在线播放 | 精品熟女少妇av免费观看 | 久久久亚洲欧洲日产国码αv | 久久久久人妻一区精品色欧美 | 呦交小u女精品视频 | 沈阳熟女露脸对白视频 | 国产成人无码a区在线观看视频app | 少妇人妻偷人精品无码视频 | 性史性农村dvd毛片 | 中文字幕乱码人妻无码久久 | 精品无码一区二区三区的天堂 | 欧美激情内射喷水高潮 | 国产成人久久精品流白浆 | 一本色道久久综合亚洲精品不卡 | av在线亚洲欧洲日产一区二区 | 久久人人爽人人人人片 | 亚洲一区二区三区香蕉 | 久久久久99精品国产片 | a片在线免费观看 | 中文字幕人妻无码一区二区三区 | 中文字幕久久久久人妻 | 88国产精品欧美一区二区三区 | 国产乱人无码伦av在线a | 日本www一道久久久免费榴莲 | 成年美女黄网站色大免费全看 | 国产人妻精品一区二区三区不卡 | 亚洲中文字幕乱码av波多ji | 成 人 免费观看网站 | 国产肉丝袜在线观看 | 久久亚洲日韩精品一区二区三区 | 一本精品99久久精品77 | 国产精品久久久久影院嫩草 | aⅴ亚洲 日韩 色 图网站 播放 | 国产suv精品一区二区五 | 天天av天天av天天透 | 久久久久99精品成人片 | 18无码粉嫩小泬无套在线观看 | 国产精品久久久久久亚洲毛片 | 精品国产一区av天美传媒 | 曰本女人与公拘交酡免费视频 | 乌克兰少妇xxxx做受 | 久久精品国产99精品亚洲 | 无码人妻av免费一区二区三区 | 熟妇人妻无乱码中文字幕 | 国产一区二区三区日韩精品 | 欧美人与禽zoz0性伦交 | 夜精品a片一区二区三区无码白浆 | av在线亚洲欧洲日产一区二区 | 午夜成人1000部免费视频 | 3d动漫精品啪啪一区二区中 | 精品成人av一区二区三区 | 亚洲一区二区观看播放 | 欧美阿v高清资源不卡在线播放 | 真人与拘做受免费视频 | 狠狠色丁香久久婷婷综合五月 | 国产成人无码一二三区视频 | 亚洲天堂2017无码 | 欧美变态另类xxxx | 精品久久久久久亚洲精品 | 学生妹亚洲一区二区 | 美女黄网站人色视频免费国产 | 国产偷自视频区视频 | 成人性做爰aaa片免费看不忠 | 午夜福利不卡在线视频 | 性生交大片免费看l | 亚洲欧美色中文字幕在线 | 日欧一片内射va在线影院 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 精品一区二区三区波多野结衣 | 日韩亚洲欧美中文高清在线 | 亚洲熟女一区二区三区 | 狠狠cao日日穞夜夜穞av | 大肉大捧一进一出视频出来呀 | 亚洲va中文字幕无码久久不卡 | 国产午夜手机精彩视频 | 色一情一乱一伦一视频免费看 | 亚洲日本一区二区三区在线 | 日本熟妇乱子伦xxxx | 在教室伦流澡到高潮hnp视频 | 老司机亚洲精品影院无码 | 亚洲人成无码网www | 欧洲vodafone精品性 | 久久国语露脸国产精品电影 | 久久精品99久久香蕉国产色戒 | 中文字幕中文有码在线 | 奇米影视7777久久精品人人爽 | 国产成人精品无码播放 | 国内精品人妻无码久久久影院 | 欧美性色19p | 东京热无码av男人的天堂 | 一本色道久久综合亚洲精品不卡 | 中文久久乱码一区二区 | 中文精品无码中文字幕无码专区 | 人妻无码αv中文字幕久久琪琪布 | 麻花豆传媒剧国产免费mv在线 | 亚洲成a人一区二区三区 | 亚洲色www成人永久网址 | 精品偷自拍另类在线观看 | 亚洲中文字幕在线观看 | 久久精品国产一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 精品久久久中文字幕人妻 | 中文精品无码中文字幕无码专区 | 377p欧洲日本亚洲大胆 | 国产性生大片免费观看性 | 暴力强奷在线播放无码 | 亚洲爆乳精品无码一区二区三区 | 人人澡人人妻人人爽人人蜜桃 | 久久国产精品二国产精品 | 欧美黑人性暴力猛交喷水 | 精品国产一区二区三区四区在线看 | 两性色午夜免费视频 | 大地资源网第二页免费观看 | 疯狂三人交性欧美 | 亚洲色无码一区二区三区 | 成熟女人特级毛片www免费 | 国产激情无码一区二区 | 激情内射日本一区二区三区 | 成人欧美一区二区三区黑人 | 影音先锋中文字幕无码 | 亚洲精品综合五月久久小说 | 在线a亚洲视频播放在线观看 | 欧美性猛交内射兽交老熟妇 | 国产乱子伦视频在线播放 | 2020最新国产自产精品 | 国产av一区二区三区最新精品 | 精品一区二区三区无码免费视频 | 波多野结衣av一区二区全免费观看 | 国色天香社区在线视频 | 成人无码精品1区2区3区免费看 | 超碰97人人做人人爱少妇 | 人妻aⅴ无码一区二区三区 | 一本久道久久综合婷婷五月 | 一本色道久久综合狠狠躁 | 精品无码一区二区三区的天堂 | aa片在线观看视频在线播放 | 兔费看少妇性l交大片免费 | 少妇性荡欲午夜性开放视频剧场 | 精品国产成人一区二区三区 | 青青草原综合久久大伊人精品 | 大肉大捧一进一出好爽视频 | 国产午夜无码视频在线观看 | 亚洲国产精品无码一区二区三区 | 国产av无码专区亚洲a∨毛片 | 国产人成高清在线视频99最全资源 | 色 综合 欧美 亚洲 国产 | 丰满少妇高潮惨叫视频 | 国产超级va在线观看视频 | 大肉大捧一进一出好爽视频 | 国产肉丝袜在线观看 | 鲁一鲁av2019在线 | 77777熟女视频在线观看 а天堂中文在线官网 | 人人妻人人澡人人爽人人精品浪潮 | 欧美激情内射喷水高潮 | 2019nv天堂香蕉在线观看 | 麻豆md0077饥渴少妇 | 成人动漫在线观看 | 国产色精品久久人妻 | 女高中生第一次破苞av | 亚拍精品一区二区三区探花 | 欧美喷潮久久久xxxxx | 波多野结衣 黑人 | 久久久国产精品无码免费专区 | 性生交片免费无码看人 | 国产精品igao视频网 | 无码人妻少妇伦在线电影 | 亚洲综合无码久久精品综合 | 亚洲人成网站免费播放 | 无码国产乱人伦偷精品视频 | 欧美日韩人成综合在线播放 | 亚洲综合无码久久精品综合 | 少妇一晚三次一区二区三区 | www成人国产高清内射 | 久久99国产综合精品 | 日本精品人妻无码免费大全 | 窝窝午夜理论片影院 | 国产精品va在线播放 | 四虎影视成人永久免费观看视频 | 中文字幕无码av波多野吉衣 | 亚洲国产欧美在线成人 | 亚洲欧美精品伊人久久 | 婷婷五月综合缴情在线视频 | 亚洲日韩av一区二区三区四区 | 18禁止看的免费污网站 | 久久人人爽人人人人片 | 秋霞成人午夜鲁丝一区二区三区 | 女人和拘做爰正片视频 | 妺妺窝人体色www婷婷 | 日本一卡二卡不卡视频查询 | 丰满妇女强制高潮18xxxx | 一本加勒比波多野结衣 | aⅴ在线视频男人的天堂 | 国产精品办公室沙发 | 亚洲精品国产a久久久久久 | 欧美激情一区二区三区成人 | 国产精品鲁鲁鲁 | 国产热a欧美热a在线视频 | 少妇的肉体aa片免费 | 欧美成人家庭影院 | 双乳奶水饱满少妇呻吟 | 免费人成在线观看网站 | 亚洲国产高清在线观看视频 | aⅴ亚洲 日韩 色 图网站 播放 | 天天爽夜夜爽夜夜爽 | 中文字幕无码免费久久99 | 爱做久久久久久 | 久久午夜无码鲁丝片 | 成熟女人特级毛片www免费 | 性生交大片免费看女人按摩摩 | 亚洲中文字幕在线无码一区二区 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产内射爽爽大片视频社区在线 | 网友自拍区视频精品 | 亚洲无人区一区二区三区 | 熟女俱乐部五十路六十路av | 内射后入在线观看一区 | 成人免费视频视频在线观看 免费 | 欧美日本日韩 | 国产精品久久国产精品99 | 国产精品久久久久久无码 | 性生交片免费无码看人 | 国产免费观看黄av片 | 国产成人精品久久亚洲高清不卡 | 成人精品视频一区二区三区尤物 | 偷窥村妇洗澡毛毛多 | 漂亮人妻洗澡被公强 日日躁 | 精品久久久中文字幕人妻 | 久久亚洲中文字幕精品一区 | 一本精品99久久精品77 | 日本www一道久久久免费榴莲 | 亚洲精品一区二区三区大桥未久 | 欧美zoozzooz性欧美 | 丝袜 中出 制服 人妻 美腿 | 日韩欧美群交p片內射中文 | 亚洲性无码av中文字幕 | 成人aaa片一区国产精品 | 国语自产偷拍精品视频偷 | 欧美熟妇另类久久久久久不卡 | 日本一卡二卡不卡视频查询 | 最近中文2019字幕第二页 | 日本www一道久久久免费榴莲 | 在线欧美精品一区二区三区 | 白嫩日本少妇做爰 | 国产sm调教视频在线观看 | 中文精品无码中文字幕无码专区 | 色综合天天综合狠狠爱 | 日本爽爽爽爽爽爽在线观看免 | 国产精品办公室沙发 | 日本精品人妻无码77777 天堂一区人妻无码 | 精品熟女少妇av免费观看 | 夜夜影院未满十八勿进 | 少妇愉情理伦片bd | 国产xxx69麻豆国语对白 | 国产精品18久久久久久麻辣 | 六十路熟妇乱子伦 | 欧洲欧美人成视频在线 | 成人片黄网站色大片免费观看 | 国产内射老熟女aaaa | 国产高清av在线播放 | 欧美老妇交乱视频在线观看 | 高潮毛片无遮挡高清免费视频 | 中文字幕 亚洲精品 第1页 | 日日麻批免费40分钟无码 | 亚洲伊人久久精品影院 | 丰满人妻精品国产99aⅴ | 女高中生第一次破苞av | 乱码午夜-极国产极内射 | 成人女人看片免费视频放人 | 国产熟女一区二区三区四区五区 | 国产成人精品优优av | 国产成人精品视频ⅴa片软件竹菊 | 少妇一晚三次一区二区三区 | 精品久久久无码中文字幕 | 亚洲欧美国产精品久久 | 撕开奶罩揉吮奶头视频 | 成人欧美一区二区三区 | 国产人妻久久精品二区三区老狼 | 日本护士xxxxhd少妇 | 扒开双腿吃奶呻吟做受视频 | 精品水蜜桃久久久久久久 | 沈阳熟女露脸对白视频 | 亚洲中文字幕成人无码 | 亚洲日本在线电影 | 少妇无码av无码专区在线观看 | 日本欧美一区二区三区乱码 | 妺妺窝人体色www婷婷 | 蜜桃臀无码内射一区二区三区 | 国产熟妇高潮叫床视频播放 | 永久免费观看美女裸体的网站 | 岛国片人妻三上悠亚 | 国产精品香蕉在线观看 | 曰本女人与公拘交酡免费视频 | 天天拍夜夜添久久精品 | 麻豆国产丝袜白领秘书在线观看 | 久久天天躁狠狠躁夜夜免费观看 | 久久久精品456亚洲影院 | 午夜精品久久久内射近拍高清 | 国产情侣作爱视频免费观看 | 撕开奶罩揉吮奶头视频 | 欧美 丝袜 自拍 制服 另类 | 成人欧美一区二区三区黑人 | 国产人成高清在线视频99最全资源 | 亚洲七七久久桃花影院 | 岛国片人妻三上悠亚 | 亚洲成a人片在线观看日本 | 国产无遮挡又黄又爽又色 | 成人无码视频免费播放 | 久久精品国产99精品亚洲 | 亚洲欧美中文字幕5发布 | 人人爽人人澡人人人妻 | 99久久久无码国产精品免费 | 亚洲中文字幕久久无码 | 成熟人妻av无码专区 | 国产亚洲精品久久久闺蜜 | 国产精品久久久久久久9999 | 无码帝国www无码专区色综合 | 国产极品美女高潮无套在线观看 | 国产成人无码av在线影院 | 国内精品久久毛片一区二区 | 老熟妇仑乱视频一区二区 | 国产精品多人p群无码 | 亚洲狠狠婷婷综合久久 | 成人无码影片精品久久久 | 亚洲精品午夜无码电影网 | 麻豆蜜桃av蜜臀av色欲av | 日韩精品乱码av一区二区 | 天下第一社区视频www日本 | 人人爽人人爽人人片av亚洲 | 国产真人无遮挡作爱免费视频 | 最新版天堂资源中文官网 | 国产精品内射视频免费 | 美女极度色诱视频国产 | 人人妻人人澡人人爽人人精品 | 亚无码乱人伦一区二区 | 97色伦图片97综合影院 | 国产香蕉尹人视频在线 | 国产成人无码午夜视频在线观看 | ass日本丰满熟妇pics | 大屁股大乳丰满人妻 | 四虎国产精品一区二区 | av人摸人人人澡人人超碰下载 | 国产猛烈高潮尖叫视频免费 | 性色欲网站人妻丰满中文久久不卡 | 国产乱人偷精品人妻a片 | 麻豆国产97在线 | 欧洲 | 97色伦图片97综合影院 | 成熟人妻av无码专区 | 亚洲va中文字幕无码久久不卡 | 欧美日本精品一区二区三区 | 人人妻人人澡人人爽精品欧美 | 免费人成网站视频在线观看 | 精品国偷自产在线 | www成人国产高清内射 | 好男人www社区 | 亚洲精品久久久久avwww潮水 | 窝窝午夜理论片影院 | 无码人中文字幕 | 伊人久久大香线蕉av一区二区 | 精品国精品国产自在久国产87 | 成人精品视频一区二区三区尤物 | 久久久久亚洲精品中文字幕 | 国产黑色丝袜在线播放 | 国产莉萝无码av在线播放 | 国内精品人妻无码久久久影院蜜桃 | 亚洲中文字幕在线无码一区二区 | 亚洲成a人片在线观看无码3d | 国内精品一区二区三区不卡 | 日日摸夜夜摸狠狠摸婷婷 | 精品国偷自产在线视频 | 成人毛片一区二区 | 亚洲色欲久久久综合网东京热 | 天堂无码人妻精品一区二区三区 | 亚洲成a人片在线观看无码 | 欧美人与禽zoz0性伦交 | 国产偷抇久久精品a片69 | 亚洲国产精品一区二区第一页 | 国产精品久久久一区二区三区 | 男女性色大片免费网站 | 中文字幕中文有码在线 | 九九热爱视频精品 | 天堂无码人妻精品一区二区三区 | 久久 国产 尿 小便 嘘嘘 | 在线亚洲高清揄拍自拍一品区 | 日本一区二区三区免费高清 | 亚洲日韩中文字幕在线播放 | 中文亚洲成a人片在线观看 | 国产精品-区区久久久狼 | 全黄性性激高免费视频 | www一区二区www免费 | 天堂在线观看www | 无码任你躁久久久久久久 | 熟妇人妻无码xxx视频 | 色五月丁香五月综合五月 | 99麻豆久久久国产精品免费 | 亚洲成在人网站无码天堂 | 亚洲精品国产品国语在线观看 | 欧美自拍另类欧美综合图片区 | 久久午夜无码鲁丝片午夜精品 | 国产成人精品视频ⅴa片软件竹菊 | 中文精品久久久久人妻不卡 | 欧美放荡的少妇 | 荡女精品导航 | 亚洲综合另类小说色区 | 久久综合九色综合欧美狠狠 | 伊人久久大香线蕉午夜 | 免费无码av一区二区 | 国产肉丝袜在线观看 | 欧美人与牲动交xxxx | 人妻熟女一区 | 国产精品国产三级国产专播 | 黑人大群体交免费视频 | 国产香蕉尹人综合在线观看 | 色婷婷香蕉在线一区二区 | 无码av中文字幕免费放 | 欧美国产日韩久久mv | 午夜福利试看120秒体验区 | 国产精品99爱免费视频 | 又粗又大又硬又长又爽 | 日本丰满护士爆乳xxxx | 久久精品国产精品国产精品污 | 中文毛片无遮挡高清免费 | 影音先锋中文字幕无码 | 午夜福利电影 | 麻豆精品国产精华精华液好用吗 | 亚洲精品国偷拍自产在线麻豆 | 一本一道久久综合久久 | 国产精品高潮呻吟av久久4虎 | 在线播放亚洲第一字幕 | 日韩视频 中文字幕 视频一区 | 99国产精品白浆在线观看免费 | 欧美亚洲日韩国产人成在线播放 | 俺去俺来也在线www色官网 | 亚洲a无码综合a国产av中文 | 亚洲成在人网站无码天堂 | 粉嫩少妇内射浓精videos | 亚无码乱人伦一区二区 | 人妻中文无码久热丝袜 | 国产手机在线αⅴ片无码观看 | 国产精品亚洲一区二区三区喷水 | 国产综合久久久久鬼色 | 国产亚洲精品久久久久久久 | 国产精品va在线观看无码 | 性欧美大战久久久久久久 | 成人一区二区免费视频 | 国产精品久久久 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲色欲色欲欲www在线 | 国产特级毛片aaaaaa高潮流水 | 久久国语露脸国产精品电影 | 国产亚洲精品久久久久久国模美 | 大色综合色综合网站 | 欧美一区二区三区视频在线观看 | 国产女主播喷水视频在线观看 | 久久久久成人精品免费播放动漫 | 波多野结衣 黑人 | 久久久久国色av免费观看性色 | 好男人社区资源 | 97精品人妻一区二区三区香蕉 | 国产精品美女久久久久av爽李琼 | 成人无码视频在线观看网站 | 色婷婷久久一区二区三区麻豆 | 日本精品人妻无码77777 天堂一区人妻无码 | 性欧美牲交xxxxx视频 | 日日躁夜夜躁狠狠躁 | 国产亚洲视频中文字幕97精品 | 欧美日韩一区二区免费视频 | 丰满肥臀大屁股熟妇激情视频 | 国产无遮挡又黄又爽又色 | 国产精品18久久久久久麻辣 | 少妇厨房愉情理9仑片视频 | 国产亚洲精品久久久闺蜜 | 亚洲理论电影在线观看 | 国产麻豆精品精东影业av网站 | 2019午夜福利不卡片在线 | 欧美人与牲动交xxxx | 久久 国产 尿 小便 嘘嘘 | 国产麻豆精品一区二区三区v视界 | 成人无码精品1区2区3区免费看 | 久久精品国产99精品亚洲 | 国语精品一区二区三区 | 黄网在线观看免费网站 | 中文无码成人免费视频在线观看 | 18禁黄网站男男禁片免费观看 | 在线 国产 欧美 亚洲 天堂 | 亚洲成在人网站无码天堂 | a片在线免费观看 | 亚洲一区二区三区偷拍女厕 | 夜夜夜高潮夜夜爽夜夜爰爰 | av香港经典三级级 在线 | 亚洲精品一区二区三区大桥未久 | 久久国产36精品色熟妇 | 欧美午夜特黄aaaaaa片 | 欧美freesex黑人又粗又大 | 久久久婷婷五月亚洲97号色 | 亚洲国产欧美日韩精品一区二区三区 | 成人一在线视频日韩国产 | 97资源共享在线视频 | 精品国产精品久久一区免费式 | 国产精品无码久久av | 国产人成高清在线视频99最全资源 | 亚洲精品一区二区三区在线 | 国产午夜精品一区二区三区嫩草 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产在线精品一区二区三区直播 | 日本一区二区三区免费播放 | 美女毛片一区二区三区四区 | 欧美性猛交xxxx富婆 | 中文字幕无码日韩欧毛 | 捆绑白丝粉色jk震动捧喷白浆 | 两性色午夜视频免费播放 | 天天爽夜夜爽夜夜爽 | 国产办公室秘书无码精品99 | 国产人妻大战黑人第1集 | 无码福利日韩神码福利片 | 性欧美熟妇videofreesex | 欧美一区二区三区视频在线观看 | 国语精品一区二区三区 | 国产午夜无码精品免费看 | 亚洲精品美女久久久久久久 | 久久久www成人免费毛片 | 久久久精品人妻久久影视 | 人人妻人人澡人人爽人人精品浪潮 | 无码国模国产在线观看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产精品资源一区二区 | 国产综合在线观看 | 国产超级va在线观看视频 | 欧美性色19p | 人妻少妇精品视频专区 | 日日麻批免费40分钟无码 | 日本熟妇浓毛 | 久久zyz资源站无码中文动漫 | 久久99精品国产麻豆蜜芽 | 桃花色综合影院 | 天天燥日日燥 | 中文字幕中文有码在线 | 国产精品久久福利网站 | 蜜桃视频插满18在线观看 | 国产成人精品一区二区在线小狼 | 久久国产精品偷任你爽任你 | 国产成人午夜福利在线播放 | 亚洲熟悉妇女xxx妇女av | 美女黄网站人色视频免费国产 | √天堂中文官网8在线 | 国产又爽又猛又粗的视频a片 | 蜜桃视频插满18在线观看 | 国产精品va在线观看无码 | 国产97色在线 | 免 | 性欧美牲交在线视频 | 丰满诱人的人妻3 | 丰满诱人的人妻3 | 双乳奶水饱满少妇呻吟 | 久精品国产欧美亚洲色aⅴ大片 | 久久人妻内射无码一区三区 | 亚洲国产一区二区三区在线观看 | 国产成人综合在线女婷五月99播放 | 狠狠色丁香久久婷婷综合五月 | 国产区女主播在线观看 | 伊人久久大香线蕉av一区二区 | 三上悠亚人妻中文字幕在线 | 动漫av网站免费观看 | 波多野42部无码喷潮在线 | 无码人中文字幕 | 国产精品福利视频导航 | 东京热无码av男人的天堂 | 天天拍夜夜添久久精品大 | 中文字幕av日韩精品一区二区 | 久久久中文久久久无码 | 亚洲人成人无码网www国产 | 中文字幕无码日韩欧毛 | 蜜桃av抽搐高潮一区二区 | 波多野结衣乳巨码无在线观看 | 免费人成网站视频在线观看 | 久久久久亚洲精品中文字幕 | 久久久久成人片免费观看蜜芽 | 丰满少妇弄高潮了www | 精品一区二区三区波多野结衣 | 日本熟妇人妻xxxxx人hd | 亚洲中文字幕乱码av波多ji | 亚洲经典千人经典日产 | 亚洲中文无码av永久不收费 | 无套内谢老熟女 | 亚洲精品一区二区三区在线观看 | 亚拍精品一区二区三区探花 | 亚洲综合伊人久久大杳蕉 | 我要看www免费看插插视频 | 国产精品亚洲一区二区三区喷水 | 无码人妻精品一区二区三区下载 | 成人影院yy111111在线观看 | 国产精品人妻一区二区三区四 | 精品一区二区三区波多野结衣 | 野外少妇愉情中文字幕 | 欧美色就是色 | 国产高潮视频在线观看 | 福利一区二区三区视频在线观看 | 国产人妻久久精品二区三区老狼 | 精品国精品国产自在久国产87 | 少妇高潮喷潮久久久影院 | 未满成年国产在线观看 | 成人av无码一区二区三区 | 奇米影视7777久久精品 | 野外少妇愉情中文字幕 | 一个人看的www免费视频在线观看 | 精品一区二区三区波多野结衣 | 成熟妇人a片免费看网站 | 国产xxx69麻豆国语对白 | 国产明星裸体无码xxxx视频 | 国产精品办公室沙发 | 色综合久久88色综合天天 | 亚洲精品鲁一鲁一区二区三区 | 中文字幕av无码一区二区三区电影 | 男人扒开女人内裤强吻桶进去 | 久久国产自偷自偷免费一区调 | 成人性做爰aaa片免费看 | 狂野欧美激情性xxxx | 久久精品中文字幕大胸 | 久久精品国产99久久6动漫 | 国产午夜亚洲精品不卡下载 | 曰韩少妇内射免费播放 | 天天拍夜夜添久久精品 | 亚洲成色在线综合网站 | 中文字幕日产无线码一区 | 精品亚洲成av人在线观看 | 精品国精品国产自在久国产87 | 日本欧美一区二区三区乱码 | 婷婷五月综合缴情在线视频 | 亚洲精品综合五月久久小说 | 熟妇人妻激情偷爽文 | 精品无码国产一区二区三区av | 免费无码午夜福利片69 | 久热国产vs视频在线观看 | 伊人久久大香线蕉亚洲 | 国产精品久久久av久久久 | 88国产精品欧美一区二区三区 | 又粗又大又硬毛片免费看 | 老子影院午夜精品无码 | 乱人伦人妻中文字幕无码 | 国产精品美女久久久久av爽李琼 | 日韩精品a片一区二区三区妖精 | 免费无码的av片在线观看 | 欧美日本精品一区二区三区 | 午夜嘿嘿嘿影院 | 亚洲精品国产精品乱码视色 | 久久精品成人欧美大片 | 女人被男人躁得好爽免费视频 | 日韩av无码中文无码电影 | 国产激情综合五月久久 | 十八禁视频网站在线观看 | 亚洲精品中文字幕久久久久 | 少妇无码一区二区二三区 | 天天爽夜夜爽夜夜爽 | 亚洲区小说区激情区图片区 | 亚洲中文字幕无码一久久区 | 男女爱爱好爽视频免费看 | 扒开双腿吃奶呻吟做受视频 | 国产无遮挡吃胸膜奶免费看 | 亚洲中文字幕无码中文字在线 | 蜜桃臀无码内射一区二区三区 | 激情综合激情五月俺也去 | 98国产精品综合一区二区三区 | 人人妻人人藻人人爽欧美一区 | 青草青草久热国产精品 |