【问题标题】:String.lastIndexOf() is there a difference between a char and a string with a single character?String.lastIndexOf() 字符和单个字符的字符串之间有区别吗?
【发布时间】:2010-08-20 23:11:33
【问题描述】:

只是想知道是否有人知道执行以下操作是否有很大不同:

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

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

【问题讨论】:

  • 别担心,它不会有很大的不同。选择一个更清晰的

标签: java performance optimization


【解决方案1】:

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

测试代码

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); 
}

输出

开始性能测试
--perfo 测试 100000000 次迭代--
字符串第一遍:8.750 秒
Char第一次通过:6.500秒
字符秒传:6.437秒
字符串第二遍:8.610 秒
63

结论

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在性能方面,可能会有细微差别。对于单个字符的搜索,使用char而不是String更快或等于。

      【讨论】:

        【解决方案4】:

        在可读性没有差异的情况下(如本例),最好使用仅搜索字符的版本。 lastIndexOf 要做的工作更少 - 在列表中查找单个元素比查找 sublist 更容易(这实际上是搜索字符串所要做的)。

        【讨论】:

        • 可读性是这里的关键。在我看来,一个不可接受的微选择是if (needle.length() == 1) { i = haystack.lastIndexOf(needle.charAt[0]); } else {...
        • 如果将来搜索字符串的长度可能超过一个字符,那么使用字符串版本的可维护性可能会有一个(公认的弱)论点——即如果需要进行这样的更改,从"&gt;""/&gt;" 的工作量会更少。
        • @Kip:这很容易在您需要时更改,IMO。
        【解决方案5】:

        字符串有额外的开销,不管它的长度是多少(除非你有一个非常聪明的编译器,它可以将单个字符串文字优化为字符常量:)),所以如果你只是搜索单个字符。这不是一个邪恶的优化,因为无论哪种方式,它都是可读的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-29
          • 2021-05-12
          • 1970-01-01
          • 1970-01-01
          • 2018-11-12
          • 1970-01-01
          • 2011-03-18
          • 2013-05-26
          相关资源
          最近更新 更多