[M3devel] heap vs. stack? (sort of)
Tony Hosking
hosking at cs.purdue.edu
Mon Jan 28 17:43:35 CET 2008
Modula-3 heap allocation is just bumping a pointer. The M3 GC is a
copying (ie, compacting) collector. Fast path allocation doesn't
even need synchronization since every thread allocates from its own
private heap buffer.
On Jan 28, 2008, at 9:00 AM, Jay wrote:
> Both.
> In thinking about how to write the code, there is no point in
> splitting the code into two functions.
> They are each small and the one is only called once.
> The language should in general not force me to write functions
> merely to work over the type system.
> <*inline*> is not implemented by the integrated backend. I assume
> every function call I write will not be inlined.
>
> > Functions can return pointers to open arrays - isn't this enough?
>
> Yes that might help.
> I had tried like
>
> PROCEDURE PickBuffer(VAR buf: ARRAY OF CHAR; len: INTEGER): ARRAY
> OF CHAR =
> BEGIN
> IF len <= NUMBER(buf)
> RETURN buf;
> END;
> RETURN NEW ARRAY OF CHAR (len);
> END PickBuffer;
>
> PROCEDURE Parse(...)
> VAR
> stack: ARRAY [0..255] OF CHAR;
> BEGIN
> ...
> WITH buf = PickBuffer(stack, len) DO
> use buf
> END;
> END Parse
>
> but I couldn't come up with a PickBuffer that the compiler liked.
>
> PickBuffer is still a bit iffy.
>
> More generally in C++ I would implement that as a template class
> where one of the parameters is how much to preallocate. In C I
> would implement it as a struct and some functions and the
> initialization function would take the preallocated buffer and size.
>
> Surely Modula-3 can do either/both of those patterns well and it
> doesn't have to be reimplemented over and over.
>
> The Modula-3 code I see around the system is way more low level and
> repetitive than seems appropriate, more so than C code that I write.
>
> Another example is that it definitely appears that if I try to
> compile code with a path like
> \a\b\c\d\e\f\g\h\a\b\c\d\e\f\g...\foo.m3
>
> that has more than around 32 path separators, I'll just get some
> random failures since the code just "gives up".
> M3Path has an array of 32 to store the positions of path separators.
> That whole chunk of code, to remove \.\ I'll probably rewrite to be
> both more efficient and have no such capacity limits.
> For \.\ it is trivial.
> For \..\ it takes a bit of cleverness -- rather than rely on any
> indefinite amount of storage, what you can do is first reverse the
> string, then whenever you se .., bump up a counter, whenever you
> see not .., bump it down, only copy from source to dest when the
> counter is zero. Roughly.
>
> Of course...maybe better here...count the slashes, if there are
> more than ~30, do the heap alloc, as in the previous pattern.
> Though it'd be nice, since it is possible, to handle arbitrarily
> long paths without the heap alloc.
>
> In a compacting garbage collection system, heap alloc can be
> roughly the cost of incrementing an integer.
> I do not assume Modula-3 has that, though maybe, and I do not
> assume it has particularly fast heap allocation.
> I have seen heap allocation just be very slow in general and I
> avoid it whenever possible/easy/correct.
>
> There are competing desires here of course.
> 1 Be fast.
> 2 Don't have fixed sized limits. (and esp. don't crash when you
> go past them! as I complained about recently..)
> 3 Don't use "too much" stack, however much that is.
>
> The easiest way to do #2 and #3 is always heap alloc exactly how
> much you need, but that kills #1.
>
> - Jay
>
>
>
> > Date: Mon, 28 Jan 2008 14:38:37 +0100
> > From: lemming at henning-thielemann.de
> > Subject: RE: [M3devel] heap vs. stack? (sort of)
> > To: jayk123 at hotmail.com
> > CC: m3devel at elegosoft.com
> >
> >
> > On Mon, 28 Jan 2008, Jay wrote:
> >
> > > I totally want common code, there's just no point in moving it
> into a separate function.
> >
> > Are you concerned about efficiency or about readability? In the
> first case
> > maybe <* INLINE *> helps?
> >
> > > I also tried WITH that got its value from "PickBuffer", also a
> useless
> > > function but at least small, but functions can't return open
> arrays.
> >
> > Functions can return pointers to open arrays - isn't this enough?
>
>
> Connect and share in new ways with Windows Live. Get it now!
More information about the M3devel
mailing list