本人在作性能測試過程當中,發現代碼中存在一個校驗手機的方法,用的是正則匹配的模式。代碼以下:java
public static boolean isTel(String tel) { Pattern p = Pattern.compile("^[1][3,4,5,6,7,8,9][0-9]{9}$"); Matcher m = p.matcher(tel); return m.matches(); }
咋一看沒啥問題,可是仔細看最後用到了matches這個方法,此方法用於徹底匹配纔會返回true,由於正則表達式中已經才用了行首和行尾的標記,其實這個用matches()方法和find()方法差不太多,find其實也能夠。這種狀況下性能差別忽略。面試
其實這裏的校驗比較簡單,使用正則並非最好的方式,由於正則很是耗時,通過本機測試,正確的手機匹配須要耗時30+ms,雖然很短,可是每次請求都校驗一次的代價全是很是大的,通過一些嘗試,終於找到了一個更高效的檢驗方法。以下:正則表達式
static boolean isTel(String tel) { try { def of = Long.valueOf(tel) if (of >= 13000000000 && of <= 19000000000) return true } catch (Exception e) { return false } }
通過測試,該方法須要5-6ms就能搞定。編程