Hi Brad!
On Thu, 15 Oct 2020 at 03:11, Bradley Lucier lucier@math.purdue.edu wrote:
On 9/30/20 9:26 AM, Adam wrote:
Dear Marc,
Is it that Gambit tends to allocate a list's elements, in sequential memory order, and |cdr| internally tends to be a +1 pointer operation?
If you have a (list arg1 ... argn) then yes, I believe that gsc generates code to allocate the pairs in the list adjacently in memory.
At allocation time they will tend to be in sequential memory, yes, I share your understanding on this one.
I also believe a GC will tend to keep a chain of cells essentially in sequence also.
I would be curious to learn if Gambit implements any particular special tricks to "help" locality - I thiiink Marc mentioned something to this effect in the past but I don't remember. Something about that a |cdr| call reduces to a memory address + operation.
I recall you said something to this effect in the past.
Thought came to mind now, that what about that Gambit could have use of an |apply| form that takes a vector as argument, due to prevalence of speed benefit of vector over list.
Please share your thoughts on this one.
I don't see how this would work, each pair in a list is still allocated using three words (one for the tag, one for the car, one for the cdr).
What I meant was a form (apply-vector thunk vector), such that (apply-vector + '#(1 2 3)) leads to (+ 1 2 3).
While |apply-vector| would admittedly be a nuance less lispy than |apply|, then it would have certain performance benefits, e.g. space density of a vector is higher than that of a list.
Since this kind of form would need to be implemented in Gambit's runtime, it's quite lowlevel, I wanted to bring it up with Marc directly here on the ML"
I added it as a feature request in a GitHub issue now: https://github.com/gambit/gambit/issues/644
Adam