On Mon, Jul 11, 2011 at 06:45:08PM -0700, Steve Edwards wrote:
>>> Also they tend to be used more by 'non-programmers' who get away with 
>>> 'stupid' stuff like calling out to system() and piping a bunch of  
>>> commands together because they don't know how to use the language  
>>> properly :)
>
> On Mon, 11 Jul 2011, [email protected] wrote:
>
>> I understand your point but I don't share it.... There are a lot  
>> Asterisk-Perl project working in production environment.
>
> Then I didn't communicate my point clearly.
>
> I'm not disparaging Perl programmers or the language. I'm just saying it  
> is easier to 'abuse' a language like Perl or PHP than C.
>
> This Bash snippet was posted to the -users list a couple of years ago. 
> I'm not trying to embarrass the original programmer or trash his skills, 
> I'm just using this snippet as an example. We've all got skeletons in our 
> closets :)
>
>> while read line; do
>>    epoch=`echo $line | cut -d '|' -f 1`
>>    if [ $epoch -ge $start_epoch -a $epoch -le $end_epoch ]; then
>>      echo $line
>>    fi
>> done < /var/log/asterisk/queue_log
>
> Note the second line. It creates a couple (2 or 3) of processes to 
> extract the first field from the queue_log file. For every line in the 
> input file!
>
> This kind of coding is easy in a scripting language. It would be way more 
> difficult in C. So much more difficult, a programmer with the requisite  
> skills to do it should recognize the inefficiency and do it another way.
>
> If the original programmer had a better grasp of the language, he could  
> have coded this line as:
>
>         epoch=${line:0:10}
>
> Since the Epoch will be 10 digits for the next 300 years, I'd feel  
> relatively comfortable with this solution.

For the record, I suspect you meant:

  epoch=${line%%|*}

This actually does exactly what is written on the above command (without
having to assume the length of the field), and also does not use
bash-specific syntax and hence can be used with a faster shell like
dash (which Debian and Ubuntu have as /bin/sh by default).

>
> This single change reduced the execution time of his script by an order 
> of magnitude.
>
> Recoding it in a language more appropriate to processing lots of data  
> (like C) would reduce the execution time to 1/3,000th of the original. 
> And yes, I did it and measured it.

Actually, that mistake is easy to make in shell scripts. But even simple
script languages such as awk fare much better here:


awk -F'|' "{
        epoch=\$1;
        if (epoch <= $start_epoch && epoch >= $end_epoch) {
                print epoch
        }
}" /var/log/asterisk/queue_log

How much time will it take you to write something as fast as this in C?

-- 
               Tzafrir Cohen
icq#16849755              jabber:[email protected]
+972-50-7952406           mailto:[email protected]
http://www.xorcom.com  iax:[email protected]/tzafrir

--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --
New to Asterisk? Join us for a live introductory webinar every Thurs:
               http://www.asterisk.org/hello

asterisk-users mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-users

Reply via email to