代码之家  ›  专栏  ›  技术社区  ›  Omar Kooheji

string.lastindexof()字符和单个字符的字符串之间有区别吗?

  •  4
  • Omar Kooheji  · 技术社区  · 16 年前

    只是想知道是否有人从他们的头顶上知道在做以下事情时有什么不同:

    String wibble = "<blah> blah blah </blah>.... <wibble> blah wibble blah </wibble> some more test here";
    
    int i = wibble.lastIndexOf(">");
    int j = wibble.lastIndexOf('>');
    
    5 回复  |  直到 16 年前
        1
  •  11
  •   Kip    16 年前

    意见很好,但数据更好。我写了一个快速基准:

    测试代码

    public static void main(String[] args)
    {
      System.out.println("Starting perfo test");
    
      final long NUM_TESTS = 100000000L;
    
      String wibble = "<blah> blah blah </blah>.... <wibble>"
                    + " blah wibble blah </wibble> some more test here";
      int x = -1;
      Stopwatch sw = new Stopwatch();
    
      System.out.println("--perfo test with " + NUM_TESTS + " iterations--");
    
      sw.start();
      for(long i = 0; i < NUM_TESTS; i++)
        x = wibble.lastIndexOf(">");
      sw.stop();
      System.out.println("String first pass: " + sw + " seconds");
    
      sw.start();
      for(long i = 0; i < NUM_TESTS; i++)
        x = wibble.lastIndexOf('>');
      sw.stop();
      System.out.println("Char first pass: " + sw + " seconds");
    
      sw.start();
      for(long i = 0; i < NUM_TESTS; i++)
        x = wibble.lastIndexOf('>');
      sw.stop();
      System.out.println("Char second pass: " + sw + " seconds");
    
      sw.start();
      for(long i = 0; i < NUM_TESTS; i++)
        x = wibble.lastIndexOf(">");
      sw.stop();
      System.out.println("String second pass: " + sw + " seconds");
    
      //Compiler warning said x was never read locally.. this is to
      //ensure the compiler doesn't optimize "x" away..
      System.out.println(x); 
    }
    

    产量

    Starting perfo test
    --perfo test with 100000000 iterations--
    String first pass: 8.750 seconds
    Char first pass: 6.500 seconds
    Char second pass: 6.437 seconds
    String second pass: 8.610 seconds
    63

    结论

    带有char的版本大约快25%,但是两个版本的执行速度都非常快,所以它可能永远不会成为代码中的瓶颈。

        2
  •  4
  •   dasony    16 年前

    实际上,您可以查看字符串类的源代码。似乎lastindex(char)和lastindex(string)实际上是单独编写的。字符串类也应该有一个开销。所以char版本可能会快一点,但我怀疑是否会出现性能有显著差异的情况。

    http://www.docjar.com/html/api/java/lang/String.java.html

        3
  •  3
  •   Mehrdad Afshari    16 年前

    从性能上看,可能会有细微的差别。搜索单个字符时,使用速度更快或等于 char 而不是 String .

        4
  •  2
  •   Jon Skeet    16 年前

    在可读性没有区别的地方(如本例中),最好使用只搜索字符的版本。LastIndexOf要做的工作更少-在列表中查找单个元素比查找 子列表 (这是搜索字符串的有效方法)。

        5
  •  0
  •   workmad3    16 年前

    一个字符串有额外的开销,不管它的长度如何(除非你有一个非常聪明的编译器,它可以将单个字符串的文本优化为字符常量:),所以如果你只搜索单个字符,你应该更喜欢char版本。这不是一个邪恶的乐观主义,因为它在可读性上是等效的。