解决方案 »

  1.   

    其实,split函数实现用的也是正则所以我认为是所写的正则计算的复杂度问题而已。
    你的第一个正则表达式是"(.* )*" + s2 + "( .*)*",一堆的 星星(星号)和月亮(括号),必须快不起来。
    第二个正则表达式是" ",只有一个空格,必须很快。
      

  2.   

    对啊,我也感觉split的实质也是正则,所以
    不是正则不行,是我不会用
    请问,这个函数的正则要如何写,才能达到不低于split的性能?我猜测split的内部可能有一个缓存机制,我第一次调用split(" ")的时候,他就在内部把他的_pattern缓存起来,这样就不用每次都compile
    猜的而已,如果是这样的话,这个机制我自己也可以实现,但是性能方面最多和split持平,而且显然不如直接调split来得方便
    请问你怎么看?
      

  3.   

    这个函数是我用来解析html中节点的class属性时,加载到xpath库中的自定义函数
    在我的系统中调用会非常频繁,预计每秒调用次数至少是好几千次
    所以我必须十分关注性能
      

  4.   

    性能的话,直接String操作更快:  public static boolean useIndexOf(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;
      }
      

  5.   

    另外,实际上,class未必全是空格,制表符之类的,都可以
      

  6.   

    4楼的方案确实是比较复杂,
    但是运行了一下,也确实非常快。100w次调用只要60ms
    结贴了
      

  7.   


    我的看法一楼已经写了,实际上就是你所编写正则的运算复杂度(与“我猜测split的内部可能有一个缓存机制”无关):
    —— 第一个正则表达式是"(.* )*" + s2 + "( .*)*",一堆的 星星(星号)和月亮(括号),必须快不起来。
    —— 第二个正则表达式是" ",只有一个空格,必须很快。
    通配符“.”和匹配搜索“*”都是很消耗计算量的,而且往往存在大量回溯操作(匹配失败后要回头再从第二个进行尝试),总的来说,可以认为是正则使用不当。