It seems to me that the massive difference in performance between homogeneous and heterogeneous arrays is at least in part a characteristic of the implementation and not the language. We currently store heterogeneous arrays as arrays of boxed pointers and perform function calls on values taken out of them using jl_apply_generic, but I think this could be made more efficient. For arrays of types that are sufficiently small or sufficiently close in size, e.g. Array{Union(Float32,Float64)}, we could store type information and value in the array instead of resorting to boxing, and we could create code that branches based on type unions instead of resorting to jl_apply_generic. Then (some?) heterogeneous arrays could be nearly as fast as homogeneous arrays, modulo branch prediction for the type. This is basically how we store DataArrays, which could just be Array{Union(T,NA)} if the compiler did this. This is easier for arrays of unions of concrete types than it is for arrays of abstract types, since for abstract types someone could subtype the element type of the array after the array has been constructed and both storage and code need to be able to accommodate that. But I'm not sure it's right to structure the language based on the performance characteristics of the current implementation unless we think they cannot be improved.
Simon On Wednesday, April 30, 2014 10:08:15 AM UTC-4, Oliver Woodford wrote: > > > > On Wednesday, April 30, 2014 2:31:43 PM UTC+1, Patrick O'Leary wrote: >> >> >> It's a flexible type system, but it doesn't provide the power of ML or >> Haskell. If you really, really want this, do a runtime check: >> >> reduce((==), [typeof(el) for el in a]) >> > > I feel that the difference between homogeneous and heterogeneous arrays is > a very important distinction, and not some odd thing that you might only > rarely care about. The distinction has a massive impact on speed. The point > of Julia is to be a fast dynamic language. Hiding the distinction under the > carpet seems contrary to one of the aims of Julia. > > Ivar's suggestion of: > @assert isleaftype(T) > is nice, but it doesn't feel quite right to me. >