540f所示的,行走器320提取節(jié)點N2510并將在偏移520c(S卩,“2”)處的區(qū)段522c(S卩,“a”)與節(jié)點N2510的元素“a”進行匹配。因為“a”在節(jié)點N2510處匹配,行走器320將當前偏移更新到520d(即,“3”)并且轉(zhuǎn)換到節(jié)點N4514,該節(jié)點由如通過編譯器306配置的節(jié)點N2510元數(shù)據(jù)指定。
[0116]于是,對于處理周期540g,行走器320可以提取下一節(jié)點N4514和在偏移520d處的下一區(qū)段522d(即,“b”)。因為“b”在節(jié)點N4514處匹配,行走器320可以轉(zhuǎn)換到下一節(jié)點N5515。節(jié)點N5515是與一個指示符相關(guān)聯(lián)的標記節(jié)點,該指示符表示與該輸入流中的正則表達式圖樣542的一個最終(即,完全或完整)的匹配。由此,對于處理周期540h,行走器320可以不繼續(xù)沿當前路徑行走并且通過在匹配結(jié)果緩沖器466中存儲一個條目來報告該最終匹配。行走器320然后可以對運行堆棧460檢查存儲線程并且如由相應(yīng)的DUP指示符所指示的那樣要么丟棄所存儲的線程要么激活它們。于是,行走器320彈出標識節(jié)點N3512和偏移520 (即,“2”)的條目,并且根據(jù)與所彈出的條目相關(guān)的DUP指示符來確定是通過以在偏移520c處的區(qū)段522c行走節(jié)點N3512來激活存儲的線程還是丟棄所存儲的線程。
[0117]如在圖5B的表538中所示,用于將有效載荷542與圖樣502進行匹配的處理周期數(shù)目是八個,并且行走器320推送并彈出了未探索的上下文以便記住并返回到節(jié)點N3512兩次。此外,表538展示了以非投機方式用有效載荷542行走NFA圖形504造成在節(jié)點N2510和N3512處以兩個處理周期處理該區(qū)段“X”。根據(jù)在此披露的實施例,此類性能可以通過減少匹配所需的處理周期數(shù)目、減少可以處理一個區(qū)段的次數(shù)、以及減少存儲和取回未探索上下文所需的訪問存儲器以進行推送和彈出操作的次數(shù)來改進。
[0118]從在此披露的實施例獲得的性能優(yōu)化可以是基于以下結(jié)論:在一個給定偏移處的一個給定的區(qū)段可以通過在NFA中的至少兩個節(jié)點來處理,并且對于大多數(shù)時間(例如,99% ),該在給定偏移處的給定區(qū)段是通過至少兩個節(jié)點處理的,該給定的區(qū)段在該至少兩個節(jié)點中的第一節(jié)點處無法匹配并且在該至少兩個節(jié)點中的第二節(jié)點處匹配。例如,在圖5A的示例實施例中,如上面參考圖5B的表538披露的,在給定偏移520b (即,“I”)處的區(qū)段522b (即,“X”)是通過兩個節(jié)點N2510和N3512處理的,并且在節(jié)點N2510處不匹配但在節(jié)點N3512處匹配。
[0119]根據(jù)在此披露的實施例,匹配性能可以通過在該至少兩個節(jié)點中的每個節(jié)點處并行地處理該在給定偏移處的區(qū)段來優(yōu)化。并行地處理該至少兩個節(jié)點在此可以被稱為投機型處理。在此披露的實施例可以是基于以下假設(shè):在至少兩個節(jié)點中的一個所選節(jié)點處的匹配操作將造成失配。該至少兩個節(jié)點中的所選節(jié)點在此可以被稱為元素節(jié)點。該至少兩個節(jié)點中的未被選擇的節(jié)點(將會基于在所選節(jié)點處的失配而被遍歷)在此可以被稱為并行節(jié)點,并且可以在與所選節(jié)點處理的相同區(qū)段的同一個處理周期中投機式地處理,以改進匹配性能。如下面參考圖描述的,節(jié)點N2510和節(jié)點N3512兩者可以用在給定偏移520b處的區(qū)段“X”處理,從而在與在節(jié)點N2510處行走在給定偏移520b處的區(qū)段“x”的同一個處理周期中,通過投機式地在節(jié)點N3512處行走在偏移520b處的區(qū)段“x”來優(yōu)化匹配性能。
[0120]圖5C是投機型處理規(guī)則578a_d的一個表570的示例實施例的框圖。表570是一個帶有行動576的真值表,這些行動是基于元素節(jié)點匹配結(jié)果574和并行節(jié)點匹配結(jié)果572。根據(jù)該投機處理規(guī)則578a-d,展示了四個可能的情況。例如,投機處理規(guī)則578a、578b,578c和578d各自具有一個對應(yīng)的后續(xù)行動576,基于匹配結(jié)果分別為肯定/肯定、肯定/否定、否定/肯定、和否定/肯定。后續(xù)行動576可以是基于并行節(jié)點572的匹配結(jié)果和在元素節(jié)點574的匹配結(jié)果的集合。
[0121]投機處理規(guī)則578b可以是特別有意義的,因為它通過在元素節(jié)點和并行節(jié)點處并行地進行匹配而優(yōu)化了匹配性能,如行動576指示更新該偏移且沒有轉(zhuǎn)換。于是,投機處理規(guī)則578b使得元素節(jié)點和并行節(jié)點能夠并行地處理下一區(qū)段,從而免除了用于節(jié)點提取的存儲器訪問。
[0122]由于并行節(jié)點是投機式處理的,如果對于元素節(jié)點的匹配結(jié)果為肯定,后續(xù)行動576針對的是提供用于元素節(jié)點的后續(xù)行動。例如,如果在元素節(jié)點的匹配結(jié)果為肯定,那么后續(xù)行動576包括更新在有效載荷中的當前偏移并且轉(zhuǎn)換到下一節(jié)點,該下一節(jié)點通過與元素節(jié)點相關(guān)聯(lián)的元數(shù)據(jù)來指定。如果元素節(jié)點的匹配結(jié)果為肯定,那么并行節(jié)點的匹配結(jié)果用于確定后續(xù)行動576是否包括推送并行節(jié)點和當前偏移以便存儲為探索的上下文。
[0123]例如,投機處理規(guī)則578a將一個條目推送到運行堆棧460以允許行走器320用在當前偏移處的區(qū)段返回到并行節(jié)點,因為返回可以產(chǎn)生在NFA圖形中的另一個部分匹配的線程。然而,如果在并行節(jié)點的匹配結(jié)果是否定匹配結(jié)果,如對于投機處理規(guī)則578c的情況,那么不將未探索的上下文推送到堆棧上,因為用在當前偏移的區(qū)段返回到并行節(jié)點將不會使該圖樣的部分匹配前進。于是,匹配的性能也可以通過投機處理規(guī)則578c來優(yōu)化,因為投機處理規(guī)則578c免除了用于匹配的至少一組推送和彈出操作。
[0124]如通過投機處理規(guī)則578d所示,基于并行節(jié)點572的匹配結(jié)果和元素節(jié)點574的匹配結(jié)果的集合,包括在每個節(jié)點的否定匹配結(jié)果,該至少一個下一后續(xù)行動可以包括不繼續(xù)行走一個給定路徑。在有效載荷之內(nèi)的下一個給定偏移處的下一區(qū)段可以基于感測未探索的上下文來行走,如通過對運行時間堆棧460檢查存儲的線程并且如果已存儲則將所存儲的線程彈出。該方法可以基于沒有感測到該未探索的上下文而終止該行走。
[0125]如通過投機處理規(guī)則578a和578c所示,基于元素節(jié)點574的匹配結(jié)果(包括在元素節(jié)點處的一個肯定匹配結(jié)果)和并行節(jié)點572的匹配結(jié)果(包括在平行節(jié)點處對該區(qū)段的一個肯定匹配結(jié)果或否定匹配結(jié)果)的集合,該至少一個后續(xù)行動包括更新該給定偏移以產(chǎn)生下一偏移并轉(zhuǎn)換到下一節(jié)點。該下一節(jié)點可以基于與該元素節(jié)點相關(guān)聯(lián)的元數(shù)據(jù)來標識。于是,該下一節(jié)點可以用在有效載荷之內(nèi)的下一偏移處的下一區(qū)段進行行走。如通過投機處理規(guī)則578a所示,基于在平行節(jié)點處對該區(qū)段的肯定匹配結(jié)果,該至少一個下一后續(xù)行動可以進一步包括在一個堆棧條目中存儲一個未探索的上下文并且將該堆棧條目推送到一個堆棧上。未探索的上下文或直接或間接地標識該并行節(jié)點和該給定偏移。
[0126]圖?是用于以一種投機方式以該有效載荷542遍歷圖5A的NFA圖形504的處理周期554a-f的示例實施例的一個表550。如在表550中所示的,處理周期554a_f可以包括在當前偏移532’用來自有效載荷542的一個區(qū)段遍歷一個當前節(jié)點530’以確定一個匹配結(jié)果534’并基于匹配結(jié)果534’確定行走行動536’。根據(jù)在此披露的實施例,行走器320可以用有效載荷542中的一個給定偏移處的一個給定的區(qū)段并行地處理節(jié)點N2510和節(jié)點N3512,從而使用圖5C中披露的投機處理規(guī)則來優(yōu)化匹配性能。例如,如下文所披露的,處理周期554c和554d可以基于N2510和節(jié)點N3512的匹配結(jié)果的集合來確定行走器行動536,。
[0127]類似于上面披露的圖5B的實施例,行走器320可以用在當前偏移520a(即,“O”)處的區(qū)段522a(即,“h”)來行走起始節(jié)點N0506。當區(qū)段522a匹配在節(jié)點N0506處的字符“h”時,行走器320可以確定匹配結(jié)果534’是肯定匹配結(jié)果。類似于圖5B的實施例,由節(jié)點N0506指示的下一節(jié)點是分離節(jié)點N1508。于是,行走器320采取處理周期554a的行動536’,該行動包括將有效載荷542中的當前偏移更新到520b (即,“I”)并且轉(zhuǎn)換到分離節(jié)點N1508。轉(zhuǎn)換可以包括提取(在此也被稱為加載)分離節(jié)點N1508。
[0128]根據(jù)圖的示例實施例,分離節(jié)點的與分離節(jié)點508相關(guān)聯(lián)的元數(shù)據(jù)可以包括一個投機處理指示符。如果該投機處理指示符沒有被包括在分離節(jié)點元數(shù)據(jù)中,行走器320可以如在圖5B的示例實施例中一樣繼續(xù)。包括該投機處理指示符可以包括在分離節(jié)點元數(shù)據(jù)中設(shè)定一個字段或其他合適的數(shù)據(jù)。設(shè)定該字段可以包括將該字段配置為真,以指示投機處理,以及將該字段配置為假,以指示非投機處理。包括該投機處理指示符可以按使行走器320能夠行走有待投機處理的NFA圖形504的至少兩個節(jié)點的任何合適的方式進行(即,并行地)。
[0129]根據(jù)圖的示例實施例,如果分離節(jié)點元數(shù)據(jù)包括該投機處理指示符,那么對于處理周期554b不消耗來自有效載荷的區(qū)段,然而行走器320提取節(jié)點N2510和節(jié)點N3512兩者。節(jié)點N2510可以被稱為元素節(jié)點,而節(jié)點N3512可以被稱為并行節(jié)點或者在該示例實施例中被稱為投機節(jié)點,因為節(jié)點N3512是被投機式處理(即,行走)的。
[0130]如對于處理周期554c所示的,行走器320可以確定對于在元素節(jié)點N2510處對于區(qū)段522b(即,“X”)的否定匹配結(jié)果和在并行節(jié)點N3512處的肯定匹配結(jié)果。這些匹配結(jié)果的集合映射到圖5C的投機處理規(guī)則條目578b。于是,投機處理規(guī)則條目578b的后續(xù)行動576指定將當前偏移更新并且將元素和并行節(jié)點N2510和N3512分別再次處理。由于節(jié)點N2510和N3512已經(jīng)被提取用于處理周期554c,所以對于處理周期554d不需要提取節(jié)點。
[0131]如對于處理周期554d所示的,行走器320用在更新后的偏移(為偏移520c(即,“2”))處的區(qū)段522c (即,“a”)來行走元素節(jié)點N2510和并行節(jié)點N3512。匹配結(jié)果534’在元素節(jié)點N2510和并行節(jié)點N3512兩者都為肯定,因為區(qū)段“a”匹配在節(jié)點N2510的元素“a”并且也匹配在節(jié)點N3512處的“~\n”元素,因為“a”不是換行字符。于是,處理周期554d的肯定匹配結(jié)果534’的集合映射到圖5C的投機處理規(guī)則條目578a。由此,可以將指示并行節(jié)點N3512和當前偏移520c (即,“2”)的未探索上下文推送到運行堆棧460上,并且可以提取由元素節(jié)點的元數(shù)據(jù)指定的下一節(jié)點。
[0132]根據(jù)該示例實施例,可以將當前偏移更新到520d( S卩,“3”)并且可以提取節(jié)點N4514,從而使行走器320轉(zhuǎn)換。對于區(qū)段522d的肯定匹配結(jié)果(即,“b”)可以對于處理周期554e在節(jié)點N4514處確定,并且行走器320可以提取標記節(jié)點N5515,從而轉(zhuǎn)換到標記節(jié)點N5515,該標記節(jié)點可以在與節(jié)點N4514相關(guān)聯(lián)的元數(shù)據(jù)中指定為節(jié)點N4514的下一節(jié)點。因為節(jié)點N5515是一個標記節(jié)點,行走器可以將最終匹配結(jié)果存儲到匹配結(jié)果緩沖器466并且不繼續(xù)行走該活動線程(例如,當前路徑)并激活一個存儲線程,如果運行堆棧460為非空。
[0133]例如,行走器320可以對運行堆棧460檢查一個空狀態(tài)。在該示例實施例中,運行堆棧460是非空的,因為未探索的上下文在處理周期554d中被推送到運行堆棧460中。于是,行走器320可以彈出未探索的上下文,該上下文指示用在偏移520d(即,“3”)處的區(qū)段522d(即,“b”)使行走前進到并行節(jié)點N3512,并且可以基于如上披露的那樣與該堆棧條目相關(guān)聯(lián)的DUP指示符來確定是丟棄未探索的上下文還是處理未探索的上下文。如在該示例實施例的表550中所不,用于將有效載荷542與圖樣502匹配的處理周期數(shù)目是六個,與在圖5B的示例實施例中使用的八個處理周期相比這個數(shù)目更少。
[0134]圖6A是一個NFA圖形604的框圖600,該圖形可以由一個行走器320使用以匹配在輸入流中的正則表達式圖樣502。在該示例實施例中,圖5A的一個區(qū)域507 (包括分離節(jié)點NI508、投機節(jié)點N3512、和ε轉(zhuǎn)換路徑530a和530b)用一個可變計數(shù)節(jié)點N1N3’ 607表示。可變計數(shù)節(jié)點N1N3’ 607是圖5A的分離節(jié)點NI508和并行(即,投機)節(jié)點N3512的
口 O
[0135]根據(jù)在此披露的實施例,可變計數(shù)節(jié)點N1N3’ 607可以被配置成用于標識一個給定元素,如字符類611 (即,Γ\η]),可變實例數(shù)目613,如無窮,如由可變計數(shù)節(jié)點所指示的??勺儗嵗龜?shù)目613可以是至少零次或任何其他合適的實例數(shù)目。應(yīng)當理解的是,給定元素字符類611是用于說明該示例實施例的目的并且該給定元素可以是通過可變計數(shù)節(jié)點Ν1Ν3’進行匹配的任何合適的元素。
[0136]可變計數(shù)節(jié)點是可以將一個元素匹配可變次數(shù)的節(jié)點,該次數(shù)可以是由一個范圍限定的(例如,零到五次)??勺冇嫈?shù)節(jié)點可以是四種可變計數(shù)節(jié)點之一:懶惰型、貪婪型、領(lǐng)屬型、或全匹配型節(jié)點。懶惰型可變計數(shù)節(jié)點可以被配置成用于在該范圍內(nèi)找到一個最短的可能元素匹配。貪婪型或領(lǐng)屬型可變計數(shù)節(jié)點可以被配置成用于在該范圍內(nèi)找到一個最長的可能元素匹配。全匹配型可變計數(shù)節(jié)點可以被配置成用于返回該有效載荷中的所有匹配。
[0137]懶惰型計數(shù)可變節(jié)點可以被配置成用于基于與該懶惰型可變計數(shù)節(jié)點相關(guān)聯(lián)的元數(shù)據(jù)所標識的下一節(jié)點處的一個區(qū)段的失配消耗(即,處理)來自有效載荷的一個區(qū)段的單個實例。貪婪型可變計數(shù)節(jié)點可以被配置成用于消耗來自有效載荷的連續(xù)的區(qū)段,直到在貪婪型可變計數(shù)節(jié)點出確定這些連續(xù)區(qū)段之一的失配或者直到貪婪型可變計數(shù)節(jié)點已經(jīng)消耗(即,處理)了可變的連續(xù)區(qū)段數(shù)目的總數(shù)。
[0138]在圖6Α的示例實施例中,可變計數(shù)節(jié)點Ν1Ν3’ 607是一個與元數(shù)據(jù)609相關(guān)聯(lián)的懶惰型可變計數(shù)節(jié)點,該元數(shù)據(jù)或直接或間接地標識下一節(jié)點617,如元素節(jié)點Ν2610。在該示例實施例中,基于在輸入流中給定元素611的可變數(shù)目連續(xù)實例613的零個或更多個匹配實例,行走器將行走前進到元素節(jié)點Ν2610。例如,在該示例實施例中,懶惰型可變計數(shù)節(jié)點Ν1Ν3’ 607被配置成用于匹配該字符類元素“~\η” (即,不是換行字符)的零個或更多個實例無限次。
[0139]根據(jù)在此披露的實施例,NFA的每個節(jié)點可以與元數(shù)據(jù)相關(guān)聯(lián),該元數(shù)據(jù)包括至少四個字段,如一個節(jié)點類型、元素、計數(shù)、和下一節(jié)點,雖然基于節(jié)點類型該至少四個字段中的一個或多個可能是不適用的。
[0140]與懶惰型可變計數(shù)節(jié)點N1N3’ 607相關(guān)聯(lián)的元數(shù)據(jù)609可以包括一個用于追蹤在有效載荷中肯定匹配的元素611的連續(xù)實例總數(shù)(未展示)的計數(shù)(未展示),以允許該總數(shù)與該可變數(shù)目613的比較。
[0141]根據(jù)在此披露的實施例,行走器320可以被配置成用于以投機方式行走NFA圖形604,以優(yōu)化在輸入流中對正則表達式圖樣502進行匹配的性能。
[0142]圖6B是用于以一種非投機方式以有效載荷542遍歷圖6A的NFA圖形604的處理周期628a-g的示例實施例的一個表618。類似于上面披露的圖5A和圖5B的實施例,行走器320可以用在當前偏移520a(即,“O”)處的區(qū)段522a(即,“h”)來行走起始節(jié)點N0606。當區(qū)段522a匹配在節(jié)點N0606處的字符“h”時,行走器320可以確定對于處理周期628a該匹配結(jié)果624是肯定匹配結(jié)果。在圖6A的實施例中,由節(jié)點N0606指示的下一節(jié)點是懶惰型可變計數(shù)節(jié)點N1N3’ 607。于是,行走器320采取處理周期628a的行動626,該行動包括將有效載荷542中的當前偏移更新到520b (即,“I”)并且轉(zhuǎn)換到懶惰型可變計數(shù)節(jié)點N1N3’ 607。轉(zhuǎn)換可以包括提取(在此也被稱為加載)懶惰型可變計數(shù)節(jié)點N1N3’ 607。
[0143]因為懶惰型可變計數(shù)節(jié)點N1N3’ 607是懶惰的,處理周期628b的行動626可以包括存儲該未探索的上下文,如通過存儲該節(jié)點N1N3’ 607和當前偏移520b (即,“I”)的一個間接或直接的標識符并且前進到由該懶惰型可變計數(shù)節(jié)點N1N3’ 607標識的下一節(jié)點617而沒有更新當前偏移。于是,對于處理周期628a,懶惰型可變計數(shù)節(jié)點N1N3’ 607沒有消耗有效載荷。
[0144]存儲該未探索的上下文可以使得行走器320能夠記得返回到懶惰型可變計數(shù)節(jié)點N1N3’ 607以便在沿所選的部分匹配路徑發(fā)生否定匹配結(jié)果的事件中在有效載荷542中的偏移520b處用區(qū)段“X”行走懶惰型可變計數(shù)節(jié)點N1N3’ 607,例如,如果該否定匹配結(jié)果是在節(jié)點N2610處或沿從節(jié)點N2610延伸的路徑上的節(jié)點處確定的。為了存儲該未探索的上下文,行走器320可以將一個條目推送630a到運行堆棧460,該條目包括一個用于懶惰型可變計數(shù)節(jié)點N1N3’ 607和偏移520b的標識符。
[0145]根據(jù)在此披露的實施例