#!/usr/local/bin/perl use 5.010; use Switch; use Benchmark 'cmpthese'; $string = "AGCTAGCTAGAAGTCGGTGACTGfoobar"; sub orig_switchcase { my @seq = split(//,$string); my $i = 0; for my $letter (@seq) { switch ($letter) { case "A" { $A0[$i]++; } case "C" { $C0[$i]++; } case "G" { $G0[$i]++; } case "T" { $T0[$i]++; } else { $N0[$i]++; } } $i++; } } sub orig_givenwhen { my @seq = split(//,$string); my $i = 0; for my $letter (@seq) { given ($letter) { when ("A") { $A1[$i]++; } when ("C") { $C1[$i]++; } when ("G") { $G1[$i]++; } when ("T") { $T1[$i]++; } default { $N1[$i]++; } } $i++; } } sub substr_givenwhen { for (my $i=0; $i \&orig_switchcase, 'orig_g/w' => \&orig_givenwhen, 'substr_g/w' => \&substr_givenwhen, BUK => \&BUK, }, ); __END__ Rate orig_s/c orig_g/w substr_g/w BUK orig_s/c 2112/s -- -91% -93% -97% orig_g/w 24660/s 1067% -- -19% -68% substr_g/w 30632/s 1350% 24% -- -60% BUK 77422/s 3565% 214% 153% --