MathGroup Archive 2009

[Date Index] [Thread Index] [Author Index]

Search the Archive

Documentation Methods and Efficiencies

  • To: mathgroup at smc.vnet.net
  • Subject: [mg100608] Documentation Methods and Efficiencies
  • From: "David Park" <djmpark at comcast.net>
  • Date: Tue, 9 Jun 2009 03:55:36 -0400 (EDT)
  • References: <h0d6s8$spq$1@smc.vnet.net> <200906070903.FAA28180@smc.vnet.net> <2018229.1244444141028.JavaMail.root@n11>

I'm starting this as a new thread because I'm shifting the topic even
further.

I'm not certain of the general effect of string comments, or regular
comments, (*  *), or even the use of longer descriptive variable names on
efficiency. We can do some tests as below. Maybe somebody can provide more
information about this. I am pretty much in Scot's camp in wanting and
needing documentation for routines that I write. 

There are many ways to produce documentation. One way is to always write a
usage message. It's easy to be lazy but usage messages are really useful,
not only because they provide information, but they also provide command
completion. Another way is to always write a SyntaxInformation statement.
These are again very useful when using the routines. If the routine has
options then it also pays to define them and include an OptionsPattern in
the SyntaxInformation. WRI has provided all these facilities, and except for
one thing, they are well designed. It will be more productive to use the WRI
documentationn facilities than design our own, and if the routines are
passed on to other users it will be easier for them.

Let's look at some cases:

f1::usage = "f1[x] returns x^2 + 1";
SyntaxInformation[f1] = {"ArgumentsPattern" -> {_}};
f1[x_] :=
 Module[{work},
  (* Square x *)
  work = x^2;
  (* Add one and return *)
  work + 1]

Timing[Do[f1[RandomReal[]], {100000}]]
{0.951, Null}

But if we copy the f1 definition cell and then use Shift-Ctrl-I or
Shift-Ctrl-N or Shift-Ctrl-T to convert it to any of the various forms, we
lose the comments. I think this is an ill-designed feature of Mathematica.
It can catch a developer, who has carefully commented his code, by surprise.
(A developer might do this to clean up a much modified routine and restore
automatic indentation.)

So one idea might be to replace the (*  *) comments by strings that do
nothing. They won't disappear if one changes the cell format. They appear to
have only a slight effect on efficiency.

f2::usage = "f2[x] returns x^2 + 1";
SyntaxInformation[f2] = {"ArgumentsPattern" -> {_}};
f2[x_] :=
 Module[{work},
  "Square of x";
  work = x^2;
  "Add one and return";
  work + 1]

Timing[Do[f2[RandomReal[]], {100000}]]
{0.967, Null}

Then we come to Scot's method. 

f3::usage = "f3[\"Take the square and add one\"][x] returns x^2 + 1";
f3["Take the square and add one"][x_] :=
 Module[{work},
  work = x^2;
  work + 1]

Timing[Do[f3["Take the square and add one"][RandomReal[]], {100000}]]
{0.952, Null}

There doesn't appear to be a significant efficiency effect between these
methods. But the last method has disadvantages. We can't define
SyntaxInformation for the x portion of the definition. And will we have to
type in the information string every time we use the routine? Maybe we can
use command completion. But that doesn't work. Try it.

I believe that Mathematica could be improved if both the SyntaxInformation
and usage statement command completion allowed for subvalues. Subvalues are
very useful in separating parameters from variables. I don't see why there
should be an insuperable obstacle here.

Now we come back to more general documentation. In many applications it
would be good practice to not only write usage messages and
SyntaxInformation statements, and also use OptionsPattern when appropriate,
but also to actually incorporate many routines in packages and write Version
6 documentation pages for them using Workbench. Well, not for everything,
but for any routine that you might use in the future, or others might use;
for routines that are part of a major research project, or used in
courseware or in an electronic book.  The function page has a place for
extensive notes on the usage. One could also include many test cases there,
and also extensive textual discussion and even developmental material. It
could certainly go beyond the standard WRI Function Help page. The advantage
is that one has a fixed and recognized place to place and obtain all the
information on a function. One doesn't have to search through old notebooks.
And what better time to set up the documentation than shortly after a
routine has been developed when the material is at hand? If the substance of
the work is being done anyway, then it makes sense to get it into the
standard documentation. It's not that much extra work, once we learn how to
use Workbench, and once WRI is willing to put a little more effort into it
and make Workbench convenient for something more than their internal
documentation.


David Park
djmpark at comcast.net
http://home.comcast.net/~djmpark/  


From: Scot T. Martin [mailto:smartin at seas.harvard.edu] 

On the general topic of performance, I'd be interested to know if anyone 
can comment on the following. In an effort to keep my codes as reasonable 
as possible, I use a lot of "sentence variables". What I mean is that I'll 
write:

myfunction["further explanation"][var1_,var2_]:= ....

I add that extra string in naming the function. This helps me immensely to 
remember what I'm doing and make my code accessible to me again in six 
months. I have often wondered, however, if I slow down Mathematica by 
using these long function names.

Does anyone know?

[For most of my applications, the limiting aspect on overall 
implementation time is my slow human CPU, so I have ample computer cycles 
and memory. However, there are a few applications that cause me to leave 
my computer running overnight, so I'm wondering somewhat about the 
performance of the code and if these long variable names are having an 
effect.]







  • Prev by Date: Re: Re: performance // Re: Re: Why
  • Next by Date: Re: 1GB Kernel Memory Limit/Out of memory errors
  • Previous by thread: Re: Re: performance // Re: Re: Why
  • Next by thread: Re: performance // Re: Re: Why is recursion so