Faster perl operation?

Joseph Sinclair plug-discussion at stcaz.net
Thu Jan 18 08:03:13 MST 2007


Joshua Zeidner wrote:
> On 1/17/07, Jerry Davis <jdawgaz at cox.net> wrote:
>>
>> On Wednesday 17 January 2007 19:34, Kevin Brown wrote:
>> > I'm working on a small script (so far only about 1000 lines long) and
>> > I'm finding that I'd like a faster way to do:
>> >
>> > $variable = "." x ($start - 1);
>> >
>> > which is incredibly slow since it is creating sometimes on the order of
>> > 100,000 to 3,000,000 (yes, Million) periods to fill up the needed
>> string.
>>
>> if you do this more than once in the code, or in a loop;
>> why don't you set up a variable at the top of your program that has the
>> needed
>> dots for the maximum number you would need -- lets say 3,000,000.
>>
>> then wherever you want n number of dots, just do $variable =
>> substr($dots,
>> 1,
>> n). this should be much faster.
> 
> 
> 
>  Jerry, I had the same idea, but are you sure that this operation will not
> allocate a new buffer and copy the entire string( essentially eliminating
> the benefit )?
> 
>  jmz
> 
---
It probably will.

The simplest method I can think of to speed it up is to do something like this:
$count = ($start - 1)
$remainder = $count % 10000
$base = "." x 10000
$variable = $base x ($count / 10000)
$tail = "." x $remainder
$variable = $variable . $tail

That should reduce the number of string reallocations by a factor of roughly 10,000.

==Joseph++

> 
> jerry
>>
>> >
>> > I've tried using:
>> > sprintf +("%s" x ($start - 1)), ".";
>> >
>> > but I must not have the syntax correct as it doesn't create the needed
>> > "." characters.
>> >
>> > Any thoughts on what is wrong with the sprintf syntax or what else I
>> > could try to speed this up?



More information about the PLUG-discuss mailing list