zoukankan
html css js c++ java
转自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)
{
#region
Regex r1
=
new
Regex(
@"
<%template ([^\[\]\{\}\s]+)%>
"
, RegexOptions.IgnoreCase
|
RegexOptions.Singleline);
Match m;
ShowTime(
"
无 RegexOptions.Compiled 开始
"
);
for
(
int
i
=
0
; i
<
100
; i
++
)
{
r1
=
new
Regex(
@"
<%template ([^\[\]\{\}\s]+)%>
"
, RegexOptions.IgnoreCase
|
RegexOptions.Singleline);
for
(m
=
r1.Match(strTemplate); m.Success; m
=
m.NextMatch())
{
strTemplate
=
strTemplate.Replace(m.Groups[
0
].ToString(),
"
\r\n
"
);
}
r1
=
new
Regex(
@"
<%loop ([^\[\]\{\}\s]+) ([^\[\]\{\}\s]+)%>
"
, RegexOptions.IgnoreCase
|
RegexOptions.Singleline);
for
(m
=
r1.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
"
);
}
r1
=
new
Regex(
@"
<%\/loop%>
"
, RegexOptions.IgnoreCase
|
RegexOptions.Singleline);
for
(m
=
r1.Match(strTemplate); m.Success; m
=
m.NextMatch())
{
strTemplate
=
strTemplate.Replace(m.Groups[
0
].ToString(),
"
\r\n\t}\t//end loop\r\n
"
);
}
r1
=
new
Regex(
@"
<%if ([^\s]+)%>
"
, RegexOptions.IgnoreCase
|
RegexOptions.Singleline);
for
(m
=
r1.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
"
);
}
r1
=
new
Regex(
@"
<%else%>
"
, RegexOptions.IgnoreCase
|
RegexOptions.Singleline);
for
(m
=
r1.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
"
);
}
r1
=
new
Regex(
@"
<%\/if%>
"
, RegexOptions.IgnoreCase
|
RegexOptions.Singleline);
for
(m
=
r1.Match(strTemplate); m.Success; m
=
m.NextMatch())
{
strTemplate
=
strTemplate.Replace(m.Groups[
0
].ToString(),
"
\r\n\t}\t//end if\r\n
"
);
}
r1
=
new
Regex(
@"
(\{strtoint\(([^\s]+?)\)\})
"
, RegexOptions.IgnoreCase
|
RegexOptions.Singleline);
for
(m
=
r1.Match(strTemplate); m.Success; m
=
m.NextMatch())
{
strTemplate
=
strTemplate.Replace(m.Groups[
0
].ToString(),
"
, 0)
"
);
}
r1
=
new
Regex(
@"
(\{urlencode\(([^\s]+?)\)\})
"
, RegexOptions.IgnoreCase
|
RegexOptions.Singleline);
for
(m
=
r1.Match(strTemplate); m.Success; m
=
m.NextMatch())
{
strTemplate
=
strTemplate.Replace(m.Groups[
0
].ToString(),
"
Utils.UrlEncode(
"
+
m.Groups[
2
].ToString()
+
"
)
"
);
}
//
解析{var.a}
r1
=
new
Regex(
@"
(\{([^\.\[\]\{\}\s]+)\.([^\[\]\{\}\s]+)\})
"
, RegexOptions.IgnoreCase
|
RegexOptions.Singleline);
for
(m
=
r1.Match(strTemplate); m.Success; m
=
m.NextMatch())
{
strTemplate
=
strTemplate.Replace(m.Groups[
0
].ToString(),
"
\
"
+
"
+ m.Groups[2].ToString() +
"
.ToString().Trim()
+
\
""
);
}
}
ShowTime(
"
无 RegexOptions.Compiled 结束
"
);
#endregion
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()
+
"
毫秒
"
);
}
}
查看全文
相关阅读:
关于深浅克隆
忙话codesmith
SynchronizedDictionary线程安全的泛型版本
自制定长的Queue
白忙活
发现一个不错的技术社区(水木清华)
自已实现线程池
Berkeley DB .net 进行添加和更新操作
关于ThreadPool.RegisterWaitForSingleObject和WaitHandle的应用介绍
1100内产生3个不重复的随机数
原文地址:https://www.cnblogs.com/kokoliu/p/610925.html
最新文章
分布式信息采集程序preview
目前来说比较.net下最好的bdb操作封装(附单元测试)
扩展方法应用
BDBViewer
boo & python笔记
最近几天的工作总结
正则表达式工具介绍
利用反射遍历Enum,并显示在ComboBox上,根据枚举的值,选中在comboBox中指定的项
(转)log4net 1.2.9使用指南
BDB使用总结
热门文章
单元测试介绍
DockPanel 2.2 last update at nov.4 2007
自制线程池4
一切从用户出发
自制线程池3
Berkeley Db Associate关联数据函数的使用
自制线程池3续
自制线程池2(限制最长执行时间、回调函数)
不要设计模式
刚才是不是访问出问题了
Copyright © 2011-2022 走看看