⾼压⼒下正则表达式的性能瓶颈
最近在做公司的系统,每秒要接受⽹络的数据在130条左右,对过长的数据进⾏截取,使⽤的⽅法是:
/// <summary>
/// 截断字符串
/// </summary>
/// <param name="maxLength">最⼤长度</param>
/// <param name="str">原字符串</param>
/// <returns></returns>
public static string LeftString(int maxLength, string str)
{
if (string.IsNullOrEmpty(str))
return "";
if (maxLength < 0)
return str;
string temp = str;
if (Regex.Replace(temp, "[\u4e00-\u9fa5]", "zz", RegexOptions.IgnoreCase).Length <= maxLength)
{
return temp;
}
for (int i = temp.Length; i >= 0; i--)
{
temp = temp.Substring(0, i);
if (Regex.Replace(temp, "[\u4e00-\u9fa5]", "zz", RegexOptions.IgnoreCase).Length <= maxLength - 3)
{
return temp + "...";
}
}
return "...";
}
在使⽤中,系统的cpu⼀直居⾼不下,主要集中在w3wp,经常达到70%-80%,服务器经常出现预警。期间百思不得其解,后经过多⽅排除,替换了这个⽅法:
/// <summary>
/// 截取字符串
/// </summary>
/// <param name="str_value"></param>
/// <param name="str_len"></param>
/// <returns></returns>
public static string LeftStringExt(string str, int length)
{
int p_num = 0;
int i;
string New_Str_value = "";
if (str == "")
{
New_Str_value = "";
}
else
{
int Len_Num = str.Length;
for (i = 0; i <= Len_Num - 1; i++)
{
if (i > Len_Num) break;
char c = Convert.ToChar(str.Substring(i, 1));
if (((int)c > 255) || ((int)c < 0))
p_num = p_num + 2;
else
p_num = p_num + 1;
if (p_num >= length)
{
New_Str_value = str.Substring(0, i + 1);
正则化长细比超限怎么调整break;
}
else
{
New_Str_value = str;
}
}
}
return New_Str_value;
}
现在w3wp的cpu基本控制在3%-4%之间。
后来在⽹上查了⼀下,发现正则表达式有性能问题,普遍要⽐普通的⽅法要慢⼗⼏-⼆⼗⼏倍。所以在⼤数据⾼并发的情况下要尽量规
避使⽤正则表达式
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论