"startsWith"比"indexOf"快吗?

Kri*_*mar 4 java

我正在用Java编写代码,我根据是否string在循环遍历某些字符时开始分支,而datasetdataset的预期会很大.

我想知道是否startsWith快于indexOf.我确实试验了2000条记录但没有发现任何差异.

Jon*_*eet 9

startsWith 只需要在字符串的最开头检查是否存在 - 它的工作量较少,因此应该更快.

我的猜测是你的2000条记录在几毫秒内完成(如果那样).每当您想要将一种方法与另一种方法进行基准测试时,请尝试在足够的时间内进行,以使时间差异显着.我发现10-30秒足以显示出显着的改进,但足够短以使得可以多次运行测试.(如果这是一个严肃的调查,我可能会尝试更长的时间.我的大多数基准测试都是为了好玩.)

还要确保您拥有不同的数据 - indexOf并且返回0 的情况下startsWith应该具有大致相同的运行时间.因此,如果您的所有记录都与模式匹配,那么您实际上并未正确测试.(我不知道你的测试当然是否属于这种情况 - 这只是需要注意的事项.)indexOf


Sea*_*lly 8

一般来说,微优化的黄金法则适用于:

"措施,不要猜测".

与此类型的所有优化一样,两个调用之间的差异几乎肯定无关紧要,除非您检查数百万个字符串,每个字符串长度为数万个字符.

在您的代码上运行一个分析器,只有在您可以衡量它是否会降低您的速度时才会优化此调用.然后,使用更易读的选项(在这种情况下,startsWith).一旦你知道这个区块正在减慢你的速度,那么试试两个并使用更快的速度.冲洗.重复;-)

在学术上,我的猜测是,使用indexOf可能会实现startsWith.检查源代码,看看你是否感兴趣.(原来,startsWith没有调用indexOf)

  • 我真的,*真的*希望startsWith 不是用indexOf 实现的。考虑“一些不以 x 开头的非常长的字符串”.startsWith("x") - 检查第一个字符后应该返回一个有效的实现,而使用 indexOf 可能需要查看整个字符串。 (3认同)

dme*_*ter 6

即使不查看源代码,也应该很清楚,至少对于大字符串和短模式,startsWith更快:

a.starts与(b)的运行时间绑定为b的长度.在最多检查前b个字符后,搜索结束.

a.indexOf(b)的运行时间较长(取决于实际算法).每个算法至少有一个运行时间取决于a的长度.粗略地说,您可以说,您必须查看每个字符一次,以检查图案是否从该位置开始.

但是,与往常一样,如果您真的看到实践中的差异,则取决于实际用例.衡量现实生活中的差异从来都不是坏事.


Pri*_*ank 0

public class Test
{
  public static void main(String args[]) {

    long value1 = System.currentTimeMillis();
    for(long i=0;i<100000000;i++)
    {
        "abcd".indexOf("a");
    }
    long value2 = System.currentTimeMillis();
    System.out.println(value2-value1);


    value1 = System.currentTimeMillis();
    for(long i=0;i<100000000;i++)
    {
        "abcd".startsWith("a");
    }
    value2 = System.currentTimeMillis();
    System.out.println(value2-value1);
  }
}
Run Code Online (Sandbox Code Playgroud)

用这段代码对其进行了测试,startsWith 的性能似乎更好,原因很明显,它不必遍历字符串。但在最好的情况下,两者都应该执行关闭,而在最坏的情况下,startsWith 总是比 indexOf 执行得更好