tech-userlevel archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: mksh import
On Thu, Dec 30, 2010 at 05:10:10PM +0000, David Laight wrote:
>
> On Thu, Dec 30, 2010 at 09:28:06AM -0500, Alex Goncharov wrote:
> > ,--- You/Thor (Thu, 30 Dec 2010 08:43:16 -0500) ----*
> > | Another question is performance. Some shells are much much faster than
> > | others for tasks like system builds. For example, zsh can actually
> > | speed up the build considerably if used to replace our /bin/sh,
> >
> > Is there more information on this -- even at the perception-like
> > level? It sounds surprising that spawning mostly (?) compilation
> > processes is comparable, in execution time, to completing the
> > nontrivial work of those spawned processes.
> >
> > Where does bash fall in terms of performance?
>
> Generlly executing shell functions and loops.
> These are VERY slow with bash and the ksh in netbsd's source tree.
>
> netbsd's /bin/sh parses shell constructs to an intermediate tree and
> then evaluates the tree - so the text isn't repeatedly parsed.
> This might be a slight loss for simple commands (including those
> from scripts) but is a massive gain for anything complicated.
>
> If you are tring to measure shell performance you do need to ensure
> that nothing has to be exec'ed.
Making another attempt to make a very basic benchmark, I constructed
a quick program that will test the shell executing a triply nested
loop executing a command of "echo -n", "/bin/echo -n" and "$SHELL
-c '/bin/echo -n'". The "echo -n" loop over much larger sets to
get the numbers high enough to be reasonable.
The results are pretty good on my laptop for /bin/sh:
$ /tmp/perf.sh
builtins externals via sh -c
/bin/sh 1.03 4.89 14.68
/bin/ksh 2.07 8.17 22.72
/usr/pkg/bin/mksh 2.53 8.67 22.55
/usr/pkg/bin/bash 29.64 8.26 20.01
/usr/pkg/bin/zsh 2.51 9.00 24.50
Obviously, this is not an exhaustive test or probably indicative
of a real world use case. It does, however, seem to indicate that
both ksh's are substantially slower for this particular workload
than /bin/sh and that bash is quite poor with these kinds of large
loops.
The script is below:
#!/bin/sh
FMT="%- 20.20s % 10.10s % 10.10s % 10.10s\n"
output() {
S="$1"
T1="$(echo "$2" | awk '{print $1}')"
T2="$(echo "$3" | awk '{print $1}')"
T3="$(echo "$4" | awk '{print $1}')"
printf "$FMT" "$S" "$T1" "$T2" "$T3"
}
the_test() {
SHELL="$1"
COMMAND="$2"
NUMBERS="$(echo "$3" | tr '\012' ' ')"
TIME=$(2>&1 time $SHELL -c "
for i in $NUMBERS; do
for j in $NUMBERS; do
for k in $NUMBERS; do
$COMMAND
done
done
done
")
echo "$TIME"
}
run_test() {
S="$1"
T1="$(the_test "$S" "echo -n" "$(jot 100)")"
T2="$(the_test "$S" "/bin/echo -n" "$(jot 20)")"
T3="$(the_test "$S" "$S -c '/bin/echo -n'" "$(jot 20)")"
output "$S" "$T1" "$T2" "$T3"
}
printf "$FMT" "" "builtins" "externals" "via sh -c"
for S in /bin/sh /bin/ksh /usr/pkg/bin/mksh /usr/pkg/bin/bash /usr/pkg/bin/zsh;
do
run_test "$S"
done
--
Roland Dowdeswell http://Imrryr.ORG/~elric/
Home |
Main Index |
Thread Index |
Old Index