Mercurial > octave-nkf
diff doc/interpreter/tips.txi @ 14116:951eacaf9381 stable
Initial documentation for broadcasting and general vectorization guidelines
* vectorize.txi: New file.
* NEWS: Update with location of broadcasting documentation.
* Makefile.am: Add vectorize.texi
* arith.txi: Move accumarray and accumdim docstring to vectorize.txi
* container.txi: Move structfun docstring to vectorize.txi
* expr.txi: Mention broadcasting where relevant.
* func.txi: Move vectorize docstring to vectorize.txi
* matrix.txi: Move function application section to vectorize.txi
* octave.texi: Add vectorize.txi and its menu options
* sparse.txi: Move spfun to vectorize.txi
* tips.txi: Move and rewrite coding tips section in vectorize.txi
* bsxfun.h (is_valid_bsxfun, is_valid_inplace_bsxfun): Rename warning
to "Octave:broadcast"
* accumdim.m: Reformat to use @example in lieu of @smallexample
* warning_ids.m: Add Octave:broadcast
* bsxfun.cc: Reword docstring to mention broadcasting
* cellfun.cc: Move comment about efficiency from tips.txi
* version.h.in: Add a big startup warning about broadcasting
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Tue, 27 Dec 2011 15:15:41 -0500 |
parents | 050bc580cb60 |
children | 72c96de7a403 |
line wrap: on
line diff
--- a/doc/interpreter/tips.txi Tue Dec 27 15:03:35 2011 -0500 +++ b/doc/interpreter/tips.txi Tue Dec 27 15:15:41 2011 -0500 @@ -28,7 +28,6 @@ @menu * Style Tips:: Writing clean and robust programs. -* Coding Tips:: Making code run faster. * Comment Tips:: Conventions for writing comments. * Function Headers:: Standard headers for functions. * Documentation Tips:: Writing readable documentation strings. @@ -75,203 +74,6 @@ copyright to anyone else, then place your name in the copyright notice. @end itemize -@node Coding Tips -@section Tips for Making Code Run Faster. -@cindex execution speed -@cindex speedups - -Here are some ways of improving the execution speed of Octave programs. - -@itemize @bullet -@item -Vectorize loops. For instance, rather than - -@example -@group -for i = 1:n-1 - a(i) = b(i+1) - b(i); -endfor -@end group -@end example - -@noindent -write - -@example -a = b(2:n) - b(1:n-1); -@end example - -This is especially important for loops with "cheap" bodies. Often it suffices -to vectorize just the innermost loop to get acceptable performance. A general -rule of thumb is that the "order" of the vectorized body should be greater or -equal to the "order" of the enclosing loop. - -@item -Use built-in and library functions if possible. Built-in and compiled functions -are very fast. Even with a m-file library function, chances are good that it is -already optimized, or will be optimized more in a future release. - -For instance, even better than - -@example -a = b(2:n) - b(1:n-1); -@end example - -@noindent -is - -@example -a = diff (b); -@end example - - -@item -Avoid computing costly intermediate results multiple times. Octave currently -does not eliminate common subexpressions. -Also, certain internal computation results are cached for variables. -For instance, if a matrix variable is used multiple times as an index, -checking the indices (and internal conversion to integers) is only done once. - -@item -Be aware of lazy copies (copy-on-write). When a copy of an object -is created, the data is not immediately copied, but rather shared. The actual -copying is postponed until the copied data needs to be modified. For example: - -@example -@group -a = zeros (1000); # create a 1000x1000 matrix -b = a; # no copying done here -b(1) = 1; # copying done here -@end group -@end example - -Lazy copying applies to whole Octave objects such as matrices, cells, struct, -and also individual cell or struct elements (not array elements). - -Additionally, index expressions also use lazy copying when Octave can determine -that the indexed portion is contiguous in memory. For example: - -@example -@group -a = zeros (1000); # create a 1000x1000 matrix -b = a(:,10:100); # no copying done here -b = a(10:100,:); # copying done here -@end group -@end example - -This applies to arrays (matrices), cell arrays, and structs indexed using (). -Index expressions generating cs-lists can also benefit of shallow copying -in some cases. In particular, when @var{a} is a struct array, expressions like -@code{@{a.x@}, @{a(:,2).x@}} will use lazy copying, so that data can be shared -between a struct array and a cell array. - -Most indexing expressions do not live longer than their `parent' objects. -In rare cases, however, a lazily copied slice outlasts its parent, in which -case it becomes orphaned, still occupying unnecessarily more memory than needed. -To provide a remedy working in most real cases, -Octave checks for orphaned lazy slices at certain situations, when a value -is stored into a "permanent" location, such as a named variable or cell or -struct element, and possibly economizes them. For example: - -@example -@group -a = zeros (1000); # create a 1000x1000 matrix -b = a(:,10:100); # lazy slice -a = []; # the original a array is still allocated -c@{1@} = b; # b is reallocated at this point -@end group -@end example - -@item -Avoid deep recursion. Function calls to m-file functions carry a relatively -significant overhead, so rewriting a recursion as a loop often helps. Also, -note that the maximum level of recursion is limited. - -@item -Avoid resizing matrices unnecessarily. When building a single result -matrix from a series of calculations, set the size of the result matrix -first, then insert values into it. Write - -@example -@group -result = zeros (big_n, big_m) -for i = over:and_over - r1 = @dots{} - r2 = @dots{} - result (r1, r2) = new_value (); -endfor -@end group -@end example - -@noindent -instead of - -@example -@group -result = []; -for i = ever:and_ever - result = [ result, new_value() ]; -endfor -@end group -@end example - -Sometimes the number of items can't be computed in advance, and stack-like -operations are needed. When elements are being repeatedly inserted at/removed -from the end of an array, Octave detects it as stack usage and attempts to use a -smarter memory management strategy pre-allocating the array in bigger chunks. -Likewise works for cell and struct arrays. - -@example -@group -a = []; -while (condition) - @dots{} - a(end+1) = value; # "push" operation - @dots{} - a(end) = []; # "pop" operation - @dots{} -endwhile -@end group -@end example - -@item -Use @code{cellfun} intelligently. The @code{cellfun} function is a useful tool -for avoiding loops. @xref{Processing Data in Cell Arrays}. -@code{cellfun} is often used with anonymous function handles; however, calling -an anonymous function involves an overhead quite comparable to the overhead -of an m-file function. Passing a handle to a built-in function is faster, -because the interpreter is not involved in the internal loop. For example: - -@example -@group -a = @{@dots{}@} -v = cellfun (@@(x) det(x), a); # compute determinants -v = cellfun (@@det, a); # faster -@end group -@end example - -@item -Octave includes a number of other functions that can replace common types of -loops, including @code{bsxfun}, @code{arrayfun}, @code{structfun}, -@code{accumarray}. These functions can take an arbitrary function as a handle. -Be sure to get familiar with them if you want to become an Octave expert. - -@item -Avoid calling @code{eval} or @code{feval} excessively, because -they require Octave to parse input or look up the name of a function in -the symbol table. - -If you are using @code{eval} as an exception handling mechanism and not -because you need to execute some arbitrary text, use the @code{try} -statement instead. @xref{The @code{try} Statement}. - -@item -If you are calling lots of functions but none of them will need to -change during your run, set the variable -@code{ignore_function_time_stamp} to @code{"all"} so that Octave doesn't -waste a lot of time checking to see if you have updated your function -files. -@end itemize @node Comment Tips @section Tips on Writing Comments