% perl5.8.0 use Benchmark; sub mychr { return pack("C", shift); } @array = @array = (0 .. 255) x 100; timethese(1000, { 'sub' => 'foreach (@array) { my $chr = chr($_) }', 'builtin' => 'foreach (@array) { my $chr = &mychr($_) }', 'direct' => 'foreach (@array) { my $chr = pack("C", $_) }', }); Benchmark: timing 1000 iterations of builtin, direct, sub... builtin: 156 wallclock secs (143.82 usr + 0.17 sys = 143.99 CPU) @ 6.94/s (n=1000) direct: 53 wallclock secs (48.89 usr + 0.04 sys = 48.93 CPU) @ 20.44/s (n=1000) sub: 37 wallclock secs (31.16 usr + 0.03 sys = 31.19 CPU) @ 32.06/s (n=1000)