On Sat, Jan 29, 2011 at 5:58 PM, Chet Ramey <chet.ra...@case.edu> wrote:
> On 1/25/11 10:08 PM, Peter O'Gorman wrote:
>> Hi,
>>
>> Dan reported a libtool performance regression in libtool-2.4 when running
>> his binaries with a large number of arguments.
>>
>> Libtool creates a shell script which usually sets some env vars and runs
>> the binary, new in recent libtool, the script also takes arguments, so
>> these have to be removed when execing the binary.
>>
>> Because forking is usually quite expensive, this shell function avoids forks:
>>
>> func_exec_program ()
>> {
>>   for lt_wr_arg
>>   do
>>     case \$lt_wr_arg in
>>     --lt-*) ;;
>>     *) set x "$@" "$lt_wr_arg"; shift;;
>>     esac
>>     shift
>>   done
>>
>>   func_exec_program_core ${1+"$@"}
>> }
>
> This is a terribly inefficient function.  You are re-evaluating "$@" for
> every argument.  (That, for various reasons, gets expensive in bash
> because of translation between different internal representations and
> increases linearly with the number of positional parameters.)
>
> Why not use what bash gives you?  Instead of reusing the positional
> parameters, use a second array.  That would allow you to use the +=
> operator, do away with the dummy `x' and shift, and pass "${array[@]}"
> to the executed function.

Probably because this is not a bash-specific script but designed to
run in any sh interpreter.

-Dan

Reply via email to