The constructs
for (;;),
while (1),
and
until (0)
all generate
exactly the same opcodes. If one is consistently faster than the other, that might perhaps tell you more about your benchmarking procedure than about the code you're trying to benchmark. :-) I tried running your code with the time limit increased from 5 CPU seconds to 60 CPU seconds, and got:
Rate {; redo;} while (1) for (;;)
{; redo;} 17.7/s -- -4% -5%
while (1) 18.5/s 4% -- -0%
for (;;) 18.5/s 5% 0% --
suggesting that
while and
for are the same speed after all, which is something of a relief.