昨天,在群里.有人讨论正则很好,可以进行验证,就避免了异常的性能损耗.结果,顺着这个话题就谈论下来了. 有人说正则耗能也不少.有人说异常耗能也不多...
俺本着没有调查没有发言权的观点,进行了一下测试,结果差距如下:
单位(ms) | 首次编译 | 第二次 | 第三次 | 第四次 | 第五次 | 重新编译 |
正则测试 | 0 | 0 | 0 | 0 | 0 | 0 |
异常测试 | 43 | 23 | 20 | 15 | 17 | 41 |
循环测试 10万次 |
0 | 0 | 0 | 0 | 0 | 0 |
循环测试 100万次 |
3 | 3 | 3 | 3 | 3 | 3 |
循环测试 1000万次 |
33 | 33 | 33 | 33 | 33 | 34 |
解释:
首次编译时,异常耗时非常之多, 循环10万次耗时是0ms,循环100万次是3ms.而且每次刷新很固定.没有变动.
而异常的第二次~第五次(是没有重新编译的). 刷新有变动. 基本徘徊在15~27ms之间. 而正则一直是0ms的稳定.
综上:异常的耗时还是非常之多的...(与循环测试做下比较就可知道)
以下是测试的代码片段:
public partial class RegexTest : System.Web.UI.Page { private const String TEST_DATA = "2009-02-40"; protected void Page_Load(object sender, EventArgs e) { TestRegex(); TestTryCatch(); TestWhile(); } private void TestWhile() { Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 10000000; i++) { } sw.Stop(); Label1.Text += "循环10000000测试用时: " + sw.ElapsedMilliseconds + "ms" + "<br/>"; } private void TestRegex() { Stopwatch sw = new Stopwatch(); sw.Start(); bool isDate = Regex.IsMatch(TEST_DATA, @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-9]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$"); Label1.Text += "正则判断:" + (isDate == true ? "日期型数据" : "非日期型数据") + "<br/>"; sw.Stop(); Label1.Text += "正则测试用时: " + sw.ElapsedMilliseconds + "ms" + "<br/>"; } private void TestTryCatch() { Stopwatch sw = new Stopwatch(); sw.Start(); try { DateTime n = Convert.ToDateTime(TEST_DATA); Label1.Text += "异常判断:日期型数据<br/>"; } catch { Label1.Text += "异常判断:非日期型数据<br/>"; } sw.Stop(); Label1.Text += "异常测试用时: " + sw.ElapsedMilliseconds + "ms" + "<br/>"; } }