[REBOL] Re: Rebol Memory Allocation Strategy?
From: joel:neely:fedex at: 22-Sep-2002 8:00
Hi, Scott,
No pro, just prose... ;-)
G. Scott Jones
wrote:
> First script rerequests a string within the function. memory
> usage fluctuates a bit but adds a fair bit of time with
> numerous iterations:
>
> Second script only sets up the string once, memory usage
> remains essentially flat, and it is four times faster than
> the first.
>
> These scripts probably mean little, but they confirm the idea
> that it is probably better to do less make-ing and more clear-
> ing. Maybe a real pro can comment using my feeble scripts.
>
IMHO "better" is a function of many things, so I prefer to use more
descriptive terms most of the time, especially in cases where there
are significant trade-offs.
Allocating a fresh string each time is more secure, as it reduces
the chances of inadvertent coupling. For example, in:
a: func-returning-string-ref
b: func-returning-string-ref
append a "foo"
if the function returns a reference to the same string (CLEARed or
not), then the last expression also mutates the value of B. This
*might* be what the programmer intended, but if not, it is a very
fertile source of subtle bugs.
IIRC, the "classic" C implementation of date formatting used a
single internal buffer for the result, returning a pointer to that
same buffer on every use. This was almost universally reviled as
a source of needless bugs and confusion.
Re-using the same string (possibly with clearing) certainly has
the advantage of speed, but one must make *sure* that there's not
any possibility that references from a prior evaluation are still
hanging around with the expectation that their former value(s)
will persist.
IMHO this is a stellar example of how tweaking a lower-level bit
of code for some presumably noble purpose can end up making life
much more complex for later, higher-level uses of said code. I
suggest that the author of a function should almost always try to
maximize simplicity of use for the caller, even at the expence of
making his/her own life more difficult. Complexity resembles
entropy in this regard; it's much easier to open a can of worms
than it is to re-can them!
-jn-
--
; Joel Neely joeldotneelyatfedexdotcom
REBOL [] do [ do func [s] [ foreach [a b] s [prin b] ] sort/skip
do function [s] [t] [ t: "" foreach [a b] s [repend t [b a]] t ] {
| e s m!zauafBpcvekexEohthjJakwLrngohOqrlryRnsctdtiub} 2 ]