Search code examples
c++stringcompiler-optimizationloop-invariant

Is using string.length() in loop efficient?


For example, assuming a string s is this:

for(int x = 0; x < s.length(); x++)

better than this?:

int length = s.length();
for(int x = 0; x < length; x++)

Solution

  • In general, you should avoid function calls in the condition part of a loop, if the result does not change during the iteration.

    The canonical form is therefore:

    for (std::size_t x = 0, length = s.length(); x != length; ++x);
    

    Note 3 things here:

    • The initialization can initialize more than one variable
    • The condition is expressed with != rather than <
    • I use pre-increment rather than post-increment

    (I also changed the type because is a negative length is non-sense and the string interface is defined in term of std::string::size_type, which is normally std::size_t on most implementations).

    Though... I admit that it's not as much for performance than for readability:

    • The double initialization means that both x and length scope is as tight as necessary
    • By memoizing the result the reader is not left in the doubt of whether or not the length may vary during iteration
    • Using pre-increment is usually better when you do not need to create a temporary with the "old" value

    In short: use the best tool for the job at hand :)