use Time::HiRes qw(time); my $buffer = "\0" x 65000; my $start = time(); substr($buffer, 10, 4) = pack('L', $_) foreach (1..900000); print "inline took ", (time() - $start), " secs\n"; $start = time(); bySVBuffer3Arg($buffer, $_) foreach (1..900000); print "bySVBuffer3Arg() took ", (time() - $start), " secs\n"; $start = time(); bySVBuffer4Arg($buffer, $_) foreach (1..900000); print "bySVBuffer4Arg() took ", (time() - $start), " secs\n"; $start = time(); byRefBuffer(\$buffer, \$_) foreach (1..900000); print "byRefBuffer() took ", (time() - $start), " secs\n"; $start = time(); byCopyBuffer($buffer, $_) foreach (1..900000); print "byCopyBuffer() took ", (time() - $start), " secs\n"; sub byCopyBuffer { my ($buf, $val) = @_; substr($buf, 10, 4) = pack('L', $val); return 1; } sub byRefBuffer { my ($buf, $val) = @_; substr($$buf, 10, 4, pack('L', $$val)); return 1; } sub bySVBuffer3Arg { substr($_[0], 10, 4) = pack('L', $_[1]); return 1; } sub bySVBuffer4Arg { substr($_[0], 10, 4, pack('L', $_[1])); return 1; }