本人在作性能测试过程当中,发现代码中存在一个校验手机的方法,用的是正则匹配的模式。代码以下: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就能搞定。编程