高压力下正则表达式的性能瓶颈

最近在做公司的系统,每秒要接受网络的数据在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%之间。

  后来在网上查了一下,发现正则表达式有性能问题,普遍要比普通的方法要慢十几-二十几倍。所以在大数据高并发的情况下要尽量规避使用正则表达式


  

时间: 2024-10-10 07:01:16

高压力下正则表达式的性能瓶颈的相关文章

linux下正则表达式

正则表达式 1.用du -sh /* 查看根下所有目录占用的内存是多少 2.lsof -i :22 查看22端口 3.清空文件,cat /dev/null>access_log清空一个文件 4.如果在oldboy/ett目录下在创建一个目录,那么/oldbot/ett的硬链接数是多少,为什么? 2个,因为子目录下的..是父目录的硬链接 5检测一个命令是否是内置命令:type 命令名称 Linux的多用户多任务介绍: 1.用户的身份是用UID(useridentify)和GID(groupiden

shell下正则表达式与其工具grep

一.grep相关知识 1.grep      grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. 2.grep工作原理      grep有两种模式:Basic和Extend模式.     在Basic模式下,命令直接grep ,其中的?.+.{}.|.()都被解释为普通字符,如果要使用其的特殊意义,就必须

php下正则表达式整理

一.正则表达式的历史背景 1,内容深厚的正则表达式 ^[email protected]+\\..+$ 形式 字符串搜索与匹配的工具 2,应用范围 手机输入法 Windows文件搜索 linux 列出文件命令 网站用户注册,如邮箱.手机号码的表单验证 ------------------------------------------------------- 二.正则表达式函数解析 1,准备工作,在此选择 php 来学习正则表达式 2,事先建立好一个 show() 函数 /** * descr

python下正则表达式的随笔记录

使用了下正则的表达式: 目的:取出字符串中{}中的内容 最后使用的正则表达式为 {(.*?)} 先看   .*?  : 首先  .  是用来匹配字符串,但是只能匹配一次. 所以加上  *  ,可以让 . 进行匹配多次,但是这样会匹配直到查找到最后一个}后才结束, 继续加上?,表示非贪婪匹配,就是只要 .* 匹配到}后就停止.然后继续匹配下一个. 再来看  (.*?), ()的意思是进行分组操作,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照"("的顺

Linux下的CPU性能瓶颈分析案例

问题描述: 在对notify执行性能测试时发现cpu负载突然飙高,cpu利用率高达95%.这时候就要排查是哪些线程消耗了cpu,并从代码层找到占用cpu的“罪魁祸首”. 步骤: 1. 先用ps+grep找到被测试的进程pid. 比如:ps –ef|grep notify,得到pid为29128. 2. 执行top -H -p,可显示出该进程下的所有线程.找到占用cpu最多的子线程pid,并将其转换为16进制. 比如:top -H -p 29128,看到notify的所有子线程.其中,%CPU 比

Linux 下正则表达式 一些小小注意

平常我们在Linux中使用正则没有什么顾忌的,不像window. 但是今天我发现其实我们还是最后注意一下以下几个特殊字符: 点:. 斜杠:/ 星号:* 这几个识别前都要加上转义的\. 另外,如果识别的group位于string的末尾,须在group的括号后面加上$!

【转】windows下文件名命名规则的正则表达式

[转自:http://blog.csdn.net/lsj19830812/article/details/4137003] 搜索了不少网站也没找到合适的,还是自己学习了下正则表达式,写了一个大家供参考 被保留的设备名不能被用来作为文件 名:CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9

C# 正则表达式 转自-每日一bo

最近写爬虫时需要用到正则表达式,有段时间没有使用正则表达式现在渐渐感觉有些淡忘,现在使用还需要去查询一些资料.为了避免以后这样的情况,在此记录下正则表达式的一些基本使用方法附带小的实例.让以后在使用时能一目了然知道他的使用,为开发节约时间,同时也分享给大家. 正则元字符 在说正则表达式之前我们先来看看通配符,我想通配符大家都用过.通配符主要有星号(*)和问号(?),用来模糊搜索文件.winodws中我们常会使用搜索来查找一些文件.如:*.jpg,XXX.docx的方式,来快速查找文件.其实正则表

python正则表达式re

1. 正则表达式简介 正则表达式并不是Python的一部分.在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别 只在于不同的编程语言实现支持的语法数量不同:但不被支持的语法通常是不常用的部分.python正则表 达式是用于文本匹配的强大工具,在源字符串中查找与给定的正则表达式相匹配的部分.一个正则表达式 是由字母.数字和特殊字符(括号.星号和问号等)组成. 正则表达式中的特殊字符:^      正则表达式的开始字符$      正则表达式的结束字符\w     匹配字母.数字.下划线,