Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is "startsWith" faster than "indexOf"?

Tags:

java

I am writing code in Java where I branch off based on whether a string starts with certain characters while looping through a dataset and my dataset is expected to be large.

I was wondering whether startsWith is faster than indexOf. I did experiment with 2000 records but not found any difference.

like image 622
Krishna Kumar Avatar asked Jun 30 '09 06:06

Krishna Kumar


2 Answers

startsWith only needs to check for the presence at the very start of the string - it's doing less work, so it should be faster.

My guess is that your 2000 records finished in a few milliseconds (if that). Whenever you want to benchmark one approach against another, try to do it for enough time that differences in timing will be significant. I find that 10-30 seconds is long enough to show significant improvements, but short enough to make it bearable to run the tests multiple times. (If this were a serious investigation I'd probably try for longer times. Most of my benchmarking is for fun.)

Also make sure you've got varied data - indexOf and startsWith should have roughly the same running time in the case where indexOf returns 0. So if all your records match the pattern, you're not really testing correctly. (I don't know whether that was the case in your tests of course - it's just something to watch out for.)

like image 113
Jon Skeet Avatar answered Oct 02 '22 18:10

Jon Skeet


In general, the golden rule of micro-optimization applies here:

"Measure, don't guess".

As with all optimizations of this type, the difference between the two calls almost certainly won't matter unless you are checking millions of strings that are each tens of thousands of characters long.

Run a profiler over your code, and only optimize this call when you can measure that it's slowing you down. Till then, go with the more readable options (startsWith, in this case). Once you know that this block is slowing you down, try both and use whichever is faster. Rinse. Repeat ;-)

Academically, my guess is that startsWith will likely be implemented using indexOf. Check the source code and see if you're interested. (Turns out that startsWith does not call indexOf)

like image 32
Sean Reilly Avatar answered Oct 02 '22 19:10

Sean Reilly