唐朝程序员

我来自唐朝

转自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()+"毫秒");
    }

}

posted on 2007-01-04 01:12  唐朝程序员  阅读(501)  评论(1编辑  收藏  举报

导航