項目開發初期的時候使用了簡單的if else 邏輯做簡單的路由判斷;
后期路由很多的情況下,比如500,這個時候再進行比對性能會比較低;
假設我們的路由寫的比較比較人性化,平均由二三個單詞組成,多的時候5個單詞,每個單詞平均長度6個字符,加上分隔符,路由平均長度為20個字符,
長的有30個字符;
如果用if else 這種進行比較,就變成了字符串匹配, 最差情況比對到最后一個,然后宣布失敗。
這種情況下字符比對的次數為20*200,
而路由又屬於經常會訪問的代碼塊;所以很有必要優化這一塊的性能;
那么,如何提高性能呢?
方法1. 前綴樹
將整個路由組織為一個前綴樹map, key, 組建前綴樹, value 定義為函數指針。這樣,每次路由訪問平均比較次數就是20次;
空間上如果路由比較稀疏,會存在空間利用率不高的情況,可以在路由上盡量緊湊一些;
方法2. 將路由轉化為數值
將路由hash 后 作為case 的值, 將if else 代碼結構變成switch case 結構。 每次比較都需要先將被匹配路由轉化為數字;
所以如何構建hash 函數,將hash 沖突解決在代碼生成的地方來降低二次匹配是一種值得考慮的方法。
這里使用了字符*Base 累加和的方法。嘗試了多次,取到沒有沖突的BAse 3。
但是base 3 ,為了簡便運算取4進制。那么只能容納64/4=16,最多16個字符長度;所以后續需要調整一下路由字符串
方法3. 直接用數字將路由代替
用數字代替,缺點:無含義,不人性。但是效率高
