高壓力下正則表達式的性能瓶頸

最近在作公司的系統,每秒要接受網絡的數據在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%之間。服務器

  後來在網上查了一下,發現正則表達式有性能問題,廣泛要比普通的方法要慢十幾-二十幾倍。因此在大數據高併發的狀況下要儘可能規避使用正則表達式網絡

相關文章
相關標籤/搜索