This makes sure both run the same number of iterations so these are properly comparable.
Also move down empty check since otherwise the JIT specializes for empty strings causing a massive skew in the performance of the other versions. In real situations it is very unlikely that the JIT heats up for a String#delete! with empty strings, so this gives a better real world picture.
This measures the number of object allocations done in scenario's where a different fraction of the objects survives. The survival creates different GC pressure patterns that we can compare. This is one of the things used for tuning the garbage collector.