String.lastIndexOf()char和具有单个字符的字符串之间有区别吗?

时间:2009-01-22 15:47:33

标签: java performance optimization

只是想知道是否有人知道如果在执行以下操作方面存在很大差异,那么是否有人知道:

String wibble = "<blah> blah blah </blah>.... <wibble> blah wibble blah </wibble> some more test here";

int i = wibble.lastIndexOf(">");
int j = wibble.lastIndexOf('>');

5 个答案:

答案 0 :(得分:12)

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

测试代码

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%,但两个版本的执行速度都非常快,因此它可能永远不会成为代码中的瓶颈。

答案 1 :(得分:4)

您实际上可以查看String类的源代码。似乎lastIndex(char)和lastIndex(String)实际上是分开编写的。 String类也应该有开销。所以char版本可能会快一点,但我怀疑是否会出现任何显着的性能差异。

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

答案 2 :(得分:3)

在性能方面,可能会略有不同。对于搜索单个字符,使用char代替String更快或相等。

答案 3 :(得分:2)

如果可读性没有差异(如本例所示),最好选择仅搜索char的版本。 lastIndexOf的工作量较少 - 在列表中找到单个元素比找到子列表更容易(这实际上是搜索字符串的行为)。

答案 4 :(得分:0)

一个字符串有额外的开销,无论它的长度是多少都需要(除非你有一个非常聪明的编译器,无论如何都会将单个字符串文字优化为字符常量:)),所以你应该更喜欢char版本,如果你只是搜索单个字符。这不是一个邪恶的优化,因为它在任何一种方式都是可读的。