2012-06-29 4 views
6

मैं 10000000 समय के लिए एक हैश मानचित्र पर एक कुंजी जोड़ता हूं। यहाँ जावा कोड और आउटपुट है:क्लोजर में जावा देशी हैश मैप धीरे-धीरे क्यों चलते हैं?

import java.util.HashMap; 

public class TestMap { 
    public static void main(String[] args) { 
     HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>(); 
     long start = System.currentTimeMillis(); 
     for (int i = 0; i < 10000000; i++) { 
      mp.put(1, 1); 
     } 
     long end = System.currentTimeMillis(); 
     System.out.println("Elapsed time: " + (end - start) + " msecs"); 
    } 
} 


$ javac TestMap.java && java -cp . TestMap 
Elapsed time: 38 msecs 

और फिर मैं आरईपीएल में clojure से जावा फोन:

user=> (import java.util.HashMap) 
java.util.HashMap 
user=> (def mp (HashMap.)) 
#'user/mp 
user=> (time (dotimes [n 10000000] (.put mp 1 1))) 
"Elapsed time: 10024.797 msecs" 
nil 

दोनों कोड एक ही बात करते हैं, लेकिन clojure संस्करण exstreamly धीमी गति से चलाता है !!

समस्या क्या है?

+1

बीटीडब्ल्यू भयानक यह क्लोजर में केवल 3 लाइनें (और पढ़ने के लिए बहुत आसान) है। – erturne

उत्तर

13

ऐड प्रकार संकेत बेहतर है:

user> (import 'java.util.HashMap) 
java.util.HashMap 
user> (def mp (HashMap.)) 
#'user/mp 
user> (time (dotimes [n 10000000] (.put mp 1 1))) 
"Elapsed time: 13932.248126 msecs" 
nil 
user> (time (dotimes [n 10000000] (.put ^HashMap mp 1 1))) 
"Elapsed time: 117.915992 msecs" 
nil 
+0

टाइप संकेतों के बारे में अधिक जानने के लिए, http://clojure.org/java_interop#Java%20Interop-Type%20 संकेत –

9

इस तरह की प्रदर्शन समस्याओं के साथ पहला कदम प्रतिबिंब चेतावनियों को चालू करना और किसी को भी हटा देना है।

(set! *warn-on-reflection* true) 

इसके अलावा लूप और रिकर में निम्नतम ओवरहेड होता है।

0

तुम भी घोषणा में घोषित करने HashMap आकार के साथ जावा कोड गति को बढ़ा सकते

HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>(10000000); 

मुझे लगता है कि यह एक भी आरईपीएल के लिए एक रास्ता है (मुझे क्या करना यह नहीं पता), क्या स्मृति स्थान आरक्षित करना संभव है?

+0

यह सच है, लेकिन इस मामले में बहुत अंतर नहीं करता है - असली समस्या प्रतिबिंब के साथ है – mikera

संबंधित मुद्दे