[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: IP-aliasing



Craig Sanders <cas@taz.net.au> writes:

> what i will never understand, though, is why people use perl for jobs that
> sh is much better suited to.  
>
> perl is great if you want awk/sed/grep/kitchen sink all rolled into one
> scripting language. but there's a price - perl's slower and bigger and
> takes longer to load.

What I will never understand is why people assume that perl is so much
slower.  For most things it's much faster since it doesn't have to
launch a separate program for most operations.

Seriously, perl is usually faster.  Just to give you some idea, here's
a comparison (standard disclaimers apply -- this only applies for the
given programs etc., but then that's what we were talking about, a
perl and sh version of the same program).

In terms of load time, I ran this ten times and got the same result
each time.

(555) time sh -c "echo hello"
hello
0.03user 0.01system 0:00.04elapsed 93%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (147major+29minor)pagefaults 0swaps

(568) time perl -e 'print "hello\n"'
hello
0.02user 0.01system 0:00.02elapsed 107%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (159major+29minor)pagefaults 0swaps


So perl is at least as fast in that department. Now take essentially
your sh script and time it:

#!/bin/sh
 
device=eth0             # aliased device
netmask=255.255.255.0   # your netmask
 
interface=0
for i in $@ ; do
  broadcast=`echo $i | sed -e 's/[^.]$/255/'`

	# Let's assume these take the same time in either language:
  # ifconfig $device:$interface $i netmask $netmask broadcast $broadcast
  # route add -host $i dev $device:$interface

  interface=$[interface + 1]
done

(517) time speed-test-bash foo bar baz bax
0.08user 0.07system 0:00.14elapsed 102%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (464major+532minor)pagefaults 0swaps

(531) time speed-test-bash foo bar baz bax
0.04user 0.11system 0:00.14elapsed 102%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (464major+532minor)pagefaults 0swaps
   

Now let's do the same thing in perl.

#!/usr/bin/perl
 
$device=eth0;             # aliased device
$netmask=255.255.255.0;   # your netmask

$interface=0;
foreach $arg (@ARGV) {

  $broadcast = $arg;
	$broadcast =~ s/[^.]$/255/;
	
	# Let's assume these take the same time in either language:
  # ifconfig $device:$interface $i netmask $netmask broadcast $broadcast
  # route add -host $i dev $device:$interface
	
  $interface++;
}

(534) time speed-test-perl foo bar baz bax
0.02user 0.01system 0:00.02elapsed 120%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (169major+30minor)pagefaults 0swaps

(535) time speed-test-perl foo bar baz bax
0.02user 0.01system 0:00.02elapsed 120%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (169major+30minor)pagefaults 0swaps
 
As you can see, in real time sh is about seven times slower.  That's
no doubt because you have to fork all those copies of sed, and the
subshells to handle the piping.

Just FYI.
--
Rob



Reply to: