我正在用Java编写代码,我根据是否string在循环遍历某些字符时开始分支,而dataset我dataset的预期会很大.
我想知道是否startsWith快于indexOf.我确实试验了2000条记录但没有发现任何差异.
startsWith 只需要在字符串的最开头检查是否存在 - 它的工作量较少,因此应该更快.
我的猜测是你的2000条记录在几毫秒内完成(如果那样).每当您想要将一种方法与另一种方法进行基准测试时,请尝试在足够的时间内进行,以使时间差异显着.我发现10-30秒足以显示出显着的改进,但足够短以使得可以多次运行测试.(如果这是一个严肃的调查,我可能会尝试更长的时间.我的大多数基准测试都是为了好玩.)
还要确保您拥有不同的数据 - indexOf并且在返回0 的情况下startsWith应该具有大致相同的运行时间.因此,如果您的所有记录都与模式匹配,那么您实际上并未正确测试.(我不知道你的测试当然是否属于这种情况 - 这只是需要注意的事项.)indexOf
一般来说,微优化的黄金法则适用于:
"措施,不要猜测".
与此类型的所有优化一样,两个调用之间的差异几乎肯定无关紧要,除非您检查数百万个字符串,每个字符串长度为数万个字符.
在您的代码上运行一个分析器,只有在您可以衡量它是否会降低您的速度时才会优化此调用.然后,使用更易读的选项(在这种情况下,startsWith).一旦你知道这个区块正在减慢你的速度,那么试试两个并使用更快的速度.冲洗.重复;-)
在学术上,我的猜测是,使用indexOf可能会实现startsWith.检查源代码,看看你是否感兴趣.(原来,startsWith没有调用indexOf)
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 执行得更好