正則表達式與字符操作的效率比較


  一起一直都覺得正則表達式很方便,各種字符串操作都優先使用正則,無意之間看到網上討論正則效率,於是自己測試了一下,發現正則在確實比較容易理解,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 + "毫秒");
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM