zoukankan      html  css  js  c++  java
  • 正则表达式与字符操作的效率比较

      一起一直都觉得正则表达式很方便,各种字符串操作都优先使用正则,无意之间看到网上讨论正则效率,于是自己测试了一下,发现正则在确实比较容易理解,bug也少。

      但是在效率上确实不如字符操作,而且正则写法的不同对效率的影响也十分巨大,如果要使用正则,应该尽量优化正则表达式

      下面是测试用例。如有不合理的地方欢迎指出

    public class RegAndChar {
        static long startTime;
        static long endTime;
        
        static {
            startTime = System.currentTimeMillis();
        }
        
        public static void main(String[] args) {
            for(int i=0;i<1000000;i++) {
                //此程序使用内存为:12963kb
                //此程序使用时间为:3186毫秒
                /*useReg("AB CDE FG", "AB");
                useReg("AB CDE FG", "CDE");
                useReg("AB CDE FG", "CD");*/
                
                //此程序使用内存为:193561kb
                //此程序使用时间为:601毫秒
                /*useSplit("AB CDE FG", "AB");
                useSplit("AB CDE FG", "CDE");
                useSplit("AB CDE FG", "CD");*/
                
                //此程序使用内存为:665kb
                //此程序使用时间为:30毫秒
                /*useSpring("AB CDE FG", "AB");
                useSpring("AB CDE FG", "CDE");
                useSpring("AB CDE FG", "CD");*/
                
                //此程序使用内存为:57818kb
                //此程序使用时间为:110毫秒
                /*useChar("AB CDE FG", "AB");
                useChar("AB CDE FG", "CDE");
                useChar("AB CDE FG", "CD");*/
                
            }
            
            /*--------------------------------------------------------------*/
            test();
        }
        
        public static boolean useReg(String s1,String s2) {
             return Pattern.compile("(.* )*" + s2 + "( .*)*").matcher(s1).matches();
        }
        
        public static boolean useSplit(String s1,String s2) {
            for(String s:s1.split(" ")) {
                if(s.equals(s2)) {
                    return true;
                }
            }
            return false;
        }
        
        public static boolean useChar(String s1,String s2) {
             char[] char1 = s1.toCharArray();
             char[] char2 = s2.toCharArray();
             for(int i=0;i<char1.length;i++) {
                 int j=0;
                 for(;j<char2.length;j++) {
                     if(char1[i+j] != char2[j]) {
                         break;
                     }
                 }
                 if(j == char2.length 
                         && (i+j >= char1.length || char1[i+j] == ' ')
                         && (i-1 <0 || char1[i-1] == ' ')) {
                     return true;
                 }
                 
             }
             return false;
        }
        
        public static boolean useSpring(String s1,String s2) {
            int length1 = s1.length();
            int length2 = s2.length();
            int limit = length1 - length2;
            char last = ' ';
            for (int i = 0; i <= limit; i++) {
              if (last == ' ' //
                  && (i == limit || s1.charAt(i + length2) == ' ') //
                  && s1.regionMatches(i, s2, 0, length2)) {
                return true;
              }
              last = s1.charAt(i);
            }
            return false;
        }
        
        public static void test() {
            endTime = System.currentTimeMillis();
            long usedTime = endTime - startTime;
            long usedMemory = (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/1024;
            System.out.println("此程序使用内存为:" + usedMemory + "kb");
            System.out.println("此程序使用时间为:" + usedTime + "毫秒");
        }
    }
  • 相关阅读:
    [已解决]报错:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m;
    比较asyncio.run_coroutine_threadsafe 和 run_in_executor的区别
    sql server表结构对比
    sql server乱码显示问题
    sql server表分区系列【转】
    无法使用备份文件,因为原先格式化该文件时所用扇区大小为 512,而目前所在设备的扇区大小为 4096
    notepad++安装SQL格式化插件
    Linux学习笔记(21)linux查看系统状态
    mysql导入报错 [Err] 1273
    mysql cte
  • 原文地址:https://www.cnblogs.com/wsss/p/5485561.html
Copyright © 2011-2022 走看看