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