最近在做公司的系統,每秒要接受網絡的數據在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%之間。
后來在網上查了一下,發現正則表達式有性能問題,普遍要比普通的方法要慢十幾-二十幾倍。所以在大數據高並發的情況下要盡量規避使用正則表達式
