Considering that shuffle and random_perm are called without arguments, and are hence shuffling empty lists, your benchmark doesn't show anything interesting.
If you change the
@_ in both subs to
@cards, I get the following results:
Rate random_perm shuffle
random_perm 6796/s -- -32%
shuffle 9955/s 46% --
It may appear that shuffle is faster. But look what happens when we shuffle 52000 cards instead of 52:
s/iter shuffle random_perm
shuffle 1.02 -- -85%
random_perm 0.158 550% --
It's well known that a shuffle based on splice doesn't scale, due to its quadratic behaviour.
Never use a splice based shuffle. For every millisecond you will gain if you shuffle a small list you'll pay a second when shuffling a large list.