转自Discuz!NT代震军的blog,修改名字为Regex的效率的奇怪的问题,哈哈
在.net1.4322 和.net2.0下,如下代码运行速度差近50倍,至今还未找到原因,目前的解决方法是在静态构造函数中直接进行声明,以提升速度,如果大家有兴趣可以看一下
RegexOptions.Compiled 这个正则项,我猜在vs2005下的框架有一些变化。
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using System.Text.RegularExpressions;
public partial class admin_RetTest2 : System.Web.UI.Page
{
public static Regex[] r=new Regex[10];
static admin_RetTest2()
{
r[0]=new Regex(@"<%template ([^\[\]\{\}\s]+)%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[1]=new Regex(@"<%template ([^\[\]\{\}\s]+)%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[2]=new Regex(@"<%loop ([^\[\]\{\}\s]+) ([^\[\]\{\}\s]+)%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[3]= new Regex(@"<%\/loop%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[4] = new Regex(@"<%if ([^\s]+)%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[5] = new Regex(@"<%else%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[6] = new Regex(@"<%\/if%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[7] = new Regex(@"(\{strtoint\(([^\s]+?)\)\})", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[8] = new Regex(@"(\{urlencode\(([^\s]+?)\)\})", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[9] = new Regex(@"(\{([^\.\[\]\{\}\s]+)\.([^\[\]\{\}\s]+)\})", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
}
public string strTemplate = "adfadsf ,adfadf aasdfadfwfadf adfadfwacx adfrafdda swfdfad";
protected void Page_Load(object sender, EventArgs e)
{
ShowTime("有 RegexOptions.Compiled 开始");
for (int i = 0; i < 100; i++)
{
for (m = r[0].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(), "\r\n");
}
for (m = r[2].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\r\n\tint " + m.Groups[1].ToString() + "__loop__id=0;\r\n\tforeach(DataRow " + m.Groups[1].ToString() + " in " + m.Groups[2].ToString() + ".Rows)\r\n\t{\r\n\t\t" + m.Groups[1].ToString() + "__loop__id++;\r\n");
}
for (m = r[3].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\r\n\t}\t//end loop\r\n");
}
for (m = r[4].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\r\n\tif(" + m.Groups[1].ToString() + ")\r\n\t{\r\n");
}
for (m = r[5].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\r\n\t}\r\n\telse\r\n\t{\r\n");
}
for (m = r[6].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\r\n\t}\t//end if\r\n");
}
for (m = r[7].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(), ", 0)");
}
for (m = r[8].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"Utils.UrlEncode(" + m.Groups[2].ToString() + ")");
}
//解析{var.a}
for (m = r[9].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\" + " + m.Groups[2].ToString() + ".ToString().Trim() + \"");
}
}
ShowTime("有 RegexOptions.Compiled 结束");
}
public void ShowTime(string name)
{
DateTime dt = DateTime.Now;
Response.Write("<br>" + name + dt.Minute.ToString() +"分"+ dt.Second.ToString() +"秒" + dt.Millisecond.ToString()+"毫秒");
}
}
RegexOptions.Compiled 这个正则项,我猜在vs2005下的框架有一些变化。
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using System.Text.RegularExpressions;
public partial class admin_RetTest2 : System.Web.UI.Page
{
public static Regex[] r=new Regex[10];
static admin_RetTest2()
{
r[0]=new Regex(@"<%template ([^\[\]\{\}\s]+)%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[1]=new Regex(@"<%template ([^\[\]\{\}\s]+)%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[2]=new Regex(@"<%loop ([^\[\]\{\}\s]+) ([^\[\]\{\}\s]+)%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[3]= new Regex(@"<%\/loop%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[4] = new Regex(@"<%if ([^\s]+)%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[5] = new Regex(@"<%else%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[6] = new Regex(@"<%\/if%>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[7] = new Regex(@"(\{strtoint\(([^\s]+?)\)\})", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[8] = new Regex(@"(\{urlencode\(([^\s]+?)\)\})", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
r[9] = new Regex(@"(\{([^\.\[\]\{\}\s]+)\.([^\[\]\{\}\s]+)\})", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
}
public string strTemplate = "adfadsf ,adfadf aasdfadfwfadf adfadfwacx adfrafdda swfdfad";
protected void Page_Load(object sender, EventArgs e)
{
ShowTime("有 RegexOptions.Compiled 开始");
for (int i = 0; i < 100; i++)
{
for (m = r[0].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(), "\r\n");
}
for (m = r[2].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\r\n\tint " + m.Groups[1].ToString() + "__loop__id=0;\r\n\tforeach(DataRow " + m.Groups[1].ToString() + " in " + m.Groups[2].ToString() + ".Rows)\r\n\t{\r\n\t\t" + m.Groups[1].ToString() + "__loop__id++;\r\n");
}
for (m = r[3].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\r\n\t}\t//end loop\r\n");
}
for (m = r[4].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\r\n\tif(" + m.Groups[1].ToString() + ")\r\n\t{\r\n");
}
for (m = r[5].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\r\n\t}\r\n\telse\r\n\t{\r\n");
}
for (m = r[6].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\r\n\t}\t//end if\r\n");
}
for (m = r[7].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(), ", 0)");
}
for (m = r[8].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"Utils.UrlEncode(" + m.Groups[2].ToString() + ")");
}
//解析{var.a}
for (m = r[9].Match(strTemplate); m.Success; m = m.NextMatch())
{
strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
"\" + " + m.Groups[2].ToString() + ".ToString().Trim() + \"");
}
}
ShowTime("有 RegexOptions.Compiled 结束");
}
public void ShowTime(string name)
{
DateTime dt = DateTime.Now;
Response.Write("<br>" + name + dt.Minute.ToString() +"分"+ dt.Second.ToString() +"秒" + dt.Millisecond.ToString()+"毫秒");
}
}