Cool, thanks.

On Sunday, July 21, 2013 12:59:16 PM UTC-7, Alex Fowler wrote:
>
> Glad you've found it! :D
>
> As an off-topic side-note: please, use no underscores in naming, use 
> hyphens instead, this is lisp's style... like "sizes_r" become "sizes-r". 
> Many ppl will thank you later :)
>
> On Sunday, July 21, 2013 11:39:17 PM UTC+4, Brian Craft wrote:
>>
>> Using getComponentType, it appears to be handling different primitive 
>> array types ok:
>>
>> (defn fconcat [& arrays]
>>  (let [sizes (map count arrays)
>>        sizes_r (vec (reductions + sizes))
>>        offsets (cons 0 (drop-last sizes_r))
>>        total (last sizes_r)
>>        out (make-array (.getComponentType (class (first arrays))) total)]
>>    (dorun (map #(System/arraycopy %2 0 out %1 %3) offsets arrays sizes))
>>    out))
>>
>>
>>
>> On Sunday, July 21, 2013 12:26:26 PM UTC-7, Brian Craft wrote:
>>>
>>> (make-array (.getComponentType (class arr)) n)  seems to work.
>>>
>>> On Sunday, July 21, 2013 12:22:41 PM UTC-7, Brian Craft wrote:
>>>>
>>>> Is there a way to create an array with the type of another array? (type 
>>>> arr) returns the array type, but make-array wants the element type not the 
>>>> array type, so 
>>>>
>>>> (make-array (type arr) n)
>>>>
>>>> doesn't work as one might hope.
>>>>
>>>>
>>>> On Sunday, July 21, 2013 8:36:22 AM UTC-7, Alex Fowler wrote:
>>>>>
>>>>> Java's System.arraycopy is the fastest you can get, since it delegates 
>>>>> execution to a function implemented in C inside JVM. Simply, this is the 
>>>>> fastest that your computer hardware can get. All in all Java arrays meet 
>>>>> the same difficulties and implications as C arrays and that is why 
>>>>> concationation of raw arrays is so "complex", in contrast to higher-level 
>>>>> collections which use objects and pointers (e.g. LinkedList). In other 
>>>>> words, difficulties you experience are natural outcome of how computer's 
>>>>> memory management is made and there is no way around them. You get the 
>>>>> most 
>>>>> of the speed from arrays because they are solid (not fragmented) chunks 
>>>>> of 
>>>>> bytes allocated in memory in the moment of their creation. For that very 
>>>>> reason you cannot extend an existing array (the size cannot be changed 
>>>>> after creation) and you can't concatenate it with another array since 
>>>>> first 
>>>>> it would have to be concatenated.
>>>>>
>>>>> The natural outcome also is that only arrays of same types can be 
>>>>> concatenated with System.arraycopy since only array pointers store type 
>>>>> data, and the contents are simply untyped bytes. And this is why it is 
>>>>> byte-level and no type-checks are ever done besiedes the initial 
>>>>> type-check. Again, higher-level pointer-based data structures like 
>>>>> LinkedList or Queue can introduce boxed typed values, but that'd be waaay 
>>>>> slower. Considering that only arrays of same type are concatenateable, 
>>>>> creating a polymorphic function is easy - simply check the argument type 
>>>>> like:
>>>>>
>>>>> ; first save types to use them later
>>>>> (def arr-type-int (class (ints 3)))
>>>>> ; ... same for other primitives...
>>>>>
>>>>> ; then in your func:
>>>>> (cond
>>>>>   (= (class arr) arr-type-int) (do-int-concat)
>>>>>   ...)
>>>>>
>>>>> For more reference:
>>>>> http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
>>>>> http://docstore.mik.ua/orelly/java-ent/jnut/ch02_09.htm
>>>>>
>>>>> As an alternative, try looking into Java NIO buffers - they too are 
>>>>> fast and too have some limits. But maybe you could make good of them, 
>>>>> depends on your use case.
>>>>>
>>>>> Although somewhat in another vein, but still relating fast data 
>>>>> management is 
>>>>> https://groups.google.com/forum/?hl=en#!topic/clojure/BayfuaqMzvs which 
>>>>> brings in C-like structs in.
>>>>>
>>>>> On Sunday, July 21, 2013 2:39:38 AM UTC+4, Brian Craft wrote:
>>>>>>
>>>>>> Here are some experiments that aren't polymorphic. The 
>>>>>> System/arraycopy version is fastest, by far. Is there any good way to 
>>>>>> make 
>>>>>> the other versions faster, or make them handle any array type?
>>>>>>
>>>>>> (defn bconcat [& arrays]
>>>>>>  (let [sizes (map count arrays)
>>>>>>        sizes_r (vec (reductions + sizes))
>>>>>>        offsets (cons 0 (drop-last sizes_r))
>>>>>>        total (last sizes_r)
>>>>>>        out (float-array total)]
>>>>>>    (dorun (map #(System/arraycopy %2 0 out %1 %3) offsets arrays 
>>>>>> sizes))
>>>>>>    out))
>>>>>>
>>>>>> (defn cconcat [& arrays]
>>>>>>  (let [vs (map vec arrays)
>>>>>>        cc (apply concat vs)]
>>>>>>    (float-array cc)))
>>>>>>
>>>>>> (defn dconcat [& arrays]
>>>>>>  (let [vs (map vec arrays)
>>>>>>        cc (reduce into [] vs)]
>>>>>>    (float-array cc)))
>>>>>>
>>>>>> (defn econcat [& arrays]
>>>>>>  (let [cc (reduce into [] arrays)]
>>>>>>    (float-array cc)))
>>>>>>
>>>>>>
>>>>>> On Saturday, July 20, 2013 2:24:14 PM UTC-7, Brian Craft wrote:
>>>>>>>
>>>>>>> Is there an easy, fast way to concat primitive arrays? I was hoping 
>>>>>>> java arrays had some common interface for this, but I haven't found 
>>>>>>> much of 
>>>>>>> use. I mostly see code like this:
>>>>>>>
>>>>>>> byte[] c = new byte[a.length + b.length];
>>>>>>> System.arraycopy(a, 0, c, 0, a.length);
>>>>>>> System.arraycopy(b, 0, c, a.length, b.length);
>>>>>>>
>>>>>>> which only works for bytes (in this case).
>>>>>>>
>>>>>>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to