guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: vectors are something else


From: Daniel Llorens
Subject: Re: vectors are something else
Date: Tue, 16 Apr 2013 06:10:21 +0200

On Apr 16, 2013, at 04:00, Mark H Weaver wrote:

>> [1] have vector- ops only accept vector- types. This removes container
>> type dispatch from the vector- ops but not from the array- ops. The
>> last patch set I've sent to the list goes in this direction. It
>> matches the behavior of other vector-like types such as bytevectors
>> and strings.
> 
> I very much favor this approach, but unfortunately I don't think we can
> do it in 2.0.  It'll have to wait until 2.2.

What should we do then about the consistency bugs? like vector? being #f on 
something that is accepted by vector-ref and so on. Did you have a look at the 
table I posted?

> I consider this option completely unacceptable.  Arrays are much more
> complex than vectors, and will inevitably be *much* slower in the common
> case where the compiler doesn't know much.

...

> Most egregiously,
> 'make-shared-array' requires that array references apply an arbitrary
> affine transformation that's unknown at compile time, which means
> multiplications and additions for each index.

make-shared-array itself is a very slow function and I'd like to have some 
alternatives, but it's only called when setting up the shared array. In any 
case, it's not slow because of any multiplications, but because of how much it 
conses.

You overestimate (by a lot) the cost of the index computation. One works on 
arrays by looping over them. In these loops the strides are always constant. No 
matter the rank of the array, in the inner loop only one index moves. The cost 
of this stepping is negligible on any scenario that isn't hugely contrived. 
Things like traversal order and memory order have a much larger impact on 
performance. 90% of the reason why Guile arrays are dog slow is that they've 
been programmed with no concern for efficiency. The other 10% is the need to do 
type dispatch on various kinds of containers and various types of elements. 
(These numbers are invented.)

> Don't get me wrong: I'm all in favor of providing flexible, generic,
> extensible procedures.  They have their place.  I think that's why
> there's still a justification for keeping 'generalized-vectors' around.

They didn't do anything that the array functions didn't do just as well. Plus 
they were buggy —they are buggy in stable-2.0. And the names took half the 
screen.

> However, efficiency demands that we also have simple, non-generic,
> non-extensible procedures as well.  IMO, we should keep the vector,
> bitvector, and bytevector procedures as simple as possible.

Other than the bizarre idea that arrays have to be slow, I think this is a 
sensible position. After all, arrays have both an array descriptor and a 
reference to linear storage, so there must be a type for this linear storage. 
(E.g. in stable-2.0, vector- operations take either arrays, in a buggy way, or 
the underlying storage type, which is called 'simple vector' and isn't exposed 
to Scheme.)

What's your take on Daniel Hartwig's position? For example a and b on the table 
I posted —b is an array, but it prints as #(2 4). How do you justify forbidding 
vector-ref for something that prints #(2 4) ?

Thanks for you comments,

        Daniel









reply via email to

[Prev in Thread] Current Thread [Next in Thread]