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

标签 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('>');

最佳答案

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

测试代码

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

关于java - String.lastIndexOf() char 和具有单个字符的字符串之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/469657/

相关文章:

javascript - 在新选项卡中打开 PDF,保存文件时给出错误的文件名

javascript - 我可以优化这个 jQuery 'toggle' 图像源函数吗?

performance - Matlab:以最少的内存和计算构建非常大的稀疏带矩阵

java - 禁用 java 日志轮换

java - 一键播放和暂停Kotlin中的媒体录制

java - 使用 jsch - java 以 root 用户身份执行 bash 命令

database - 具有大量插入的 Web 应用程序的性能

algorithm - 尝试优化此算法/代码以计算 a 和 b 之间互质整数的最大子集

c# - 在 C# 中确定未修剪的字符串是否为空的最有效方法是什么?

c++ - g++ 对 -Ofast 做了哪些额外的优化?