Performance optimization (allocation inside a for loop)

James Sherman Jr. shermanj at umd.edu
Wed Apr 1 16:35:52 CDT 2009


I'm sure someone will answer this in a more technically precise way, but I
believe the answer is, in short, no.  Essentially since octave is a script,
there is no way for octave to "know" that you are going to eventually want a
vector of size n.  It basically sees (in the first case)

allocate room for a vector of size 1
write vector of size 1
allocate room for a vector of size 2
copy previous vector
write new value at end of vector

and so on.  The second case is:
allocate room for a vector of size n
write value in first element
write value in second element

and so on.  At least this is my understanding.

James

On Wed, Apr 1, 2009 at 4:15 PM, r <nbs.public at gmail.com> wrote:

> I've recently hit a performance problem with a "for" loop producing
> vectors of data. Consider the following (deliberately simple) example:
>
> function retval = test(n)
>  # retval = zeros(1, n);
>  for n = [1:n]
>    retval(n) = n;
>  endfor
> endfunction
>
> octave:26> tic;test(10000);toc
> Elapsed time is 0.8 seconds.
> octave:27> tic;test(100000);toc
> Elapsed time is 72 seconds.
>
> So the complexity is O(n^2).
>
> The same function with a preallocated retval vector:
>
> function retval = test2(n)
>  retval = zeros(1, n);
>  for n = [1:n]
>    retval(n) = n;
>  endfor
> endfunction
>
> has a complexity of O(n):
>
> octave:29> tic;test2(10000);toc
> Elapsed time is 0.16 seconds.
> octave:30> tic;test2(100000);toc
> Elapsed time is 1.9 seconds.
>
> Is it possible to adjust the Octave's allocation algorithm so that it
> could allocate larger chunks of data (or growing chunks of data)?
>
> Regards,
> -r.
> _______________________________________________
> Help-octave mailing list
> Help-octave at octave.org
> https://www-old.cae.wisc.edu/mailman/listinfo/help-octave
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://www-old.cae.wisc.edu/pipermail/help-octave/attachments/20090401/a67dec67/attachment.html 


More information about the Help-octave mailing list