The speed difference of a loop is so meaningless compared to forcing the whole recordset to come from the client and be memory resident (or paged to local disk) just so you can MOVELAST and MOVEFIRST to get the recordcount.

That MOVELAST operation could be noticeable to the user.

We always choose the DO WHILE/rs.EOF technique.