It depends on how each are setup, but in practice, it doesn't really matter. Just use whichever is best for your situation. I use both all the time. With today's multicore, hyper-threaded CPUs and super-optimized compilers, trying to second-guess the technology or the compiler is just fruitless. Just use whichever is right for the situation.
That being said, there are just some things that you can do out of habit to make things go smoother. Take, for example, this:
while( foo == doAnIncrediblyLongCalculationHere() )
{
}
Can easily be optimized to this:
int result = doAnIncrediblyLongCalculationHere();
while( foo == result )
{
}
Will any reasonable compiler do the optimization anyway? Yes. Does it pay to take the chance? No. Plus anyone else inspecting the code wouldn't be able to see the otpmization you hope is taking place for you.
Don't stress over which is more efficient. Used correctly, they both rock. The do...while loop is rarely employed, but it's useful in some situations too. HTH