Yup. As it turns out, the slow down is pretty much due to reflection. After 
added type hint, it's much better now.
The code can be viewed here: 
https://github.com/malloc82/imaging/blob/45475b99f564b1ac77e668e04b91cb9c01a096d7/src/imaging/dicom.clj#L46-L161

They are three different implementations, here is the performance for each 
one:
imaging.dicom> (def data1 (timer "total: " (load-txt-image 
"resources/PCT/CTP404_merged/x_11.txt")))
  ==> timing:      loading txt data 513.267672 ms
  ==> timing:                   max 61.782047 ms
  ==> timing:                   min 62.4488 ms
  ==> timing:   update pixel values 281.222481 ms
  ==> timing:               total:  952.981063 ms
#'imaging.dicom/data1
imaging.dicom> (def data3 (timer "total: " (load-txt-image_matrix 
"resources/PCT/CTP404_merged/x_11.txt")))
  ==> timing:      loading txt data 728.267621 ms
  ==> timing:                   max 25.00652 ms
  ==> timing:                   min 25.575979 ms
  ==> timing:   update pixel values 111.647122 ms
  ==> timing:               total:  926.00495 ms
#'imaging.dicom/data3
imaging.dicom> (def data2 (timer "total: " (load-txt-image_array 
"resources/PCT/CTP404_merged/x_11.txt")))
  ==> timing:      loading txt data 664.818514 ms
  ==> timing:            min max :  429.855274 ms
  ==> timing:   update pixel values 361.323422 ms
  ==> timing:               total:  1491.792197 ms
#'imaging.dicom/data2
imaging.dicom> 

The core.matrix one is the fastest, persistent vector is the second, but 
very close. Double array is actually the slowest one.
Lesson learned here for me is that only use java array when absolutely 
necessary. I always thought since it's primitive array, it should be the 
fastest. Apparently not!

Thanks for the hint.

On Wednesday, June 10, 2015 at 3:08:44 PM UTC-5, Andy Fingerhut wrote:
>
> Add this line at the top of your file where you try areduce and loop, and 
> look for any reflection warnings that occur when loading the file:
>
> (set! *warn-on-reflection* true)
>
> If there are none, probably best to post a link to your code, or paste it 
> in a message here if it is short enough, so others can give more precise 
> suggestions.
>
> Andy
>
> On Wed, Jun 10, 2015 at 1:03 PM, Ritchie Cai <ritch...@gmail.com 
> <javascript:>> wrote:
>
>> I'm working on a java array of double with 1280000 elements. I need the 
>> max and min values of the array. So I initially tried areduce and loop, 
>> both gives runs around 20 seconds. But when try (apply max (vec array)) I 
>> get result under 90 ms.
>> Can anyone explain why there is such a big difference?
>> Also if want to iterate large java array like this to do some other 
>> operations, e.g. convolution, what's the best way to go? Is there another 
>> fast way to iterate through array or do I need to convert array into vector?
>>
>> Thanks
>> Ritchie
>>
>>  -- 
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clo...@googlegroups.com 
>> <javascript:>
>> Note that posts from new members are moderated - please be patient with 
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com <javascript:>
>> 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+u...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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/d/optout.

Reply via email to