2012-04-21 94 views
12

प्रदर्शन और सुरक्षा के लिए मैं एक निश्चित आकार वाले वेक्टर को कार्यान्वित करना चाहता हूं जो अपरिवर्तनीय और विशिष्ट दोनों (मुझे तेज़ अंकगणित की आवश्यकता है)। मेरा पहला विचार @specialized एनोटेशन का उपयोग करना था (क्योंकि मुझे दोनों पूर्णांक और वास्तविकताओं की आवश्यकता है)।एक निश्चित आकार, अपरिवर्तनीय, और विशेष वेक्टर लागू करना

package so 
class Vec[@specialized A] private[so] (ary: Array[A]) { 
    def apply(i: Int) = ary(i) 
} 

हालांकि, जब मैं javap साथ जिसके परिणामस्वरूप बाईटकोड का विश्लेषण, मैं देख सकता है कि तत्वों अभी भी बॉक्सिंग कर रहे हैं:

यहाँ एक पहली कोशिश है। उदाहरण के लिए:

public double apply$mcD$sp(int); 
    Code: 
    0: aload_0 
    1: iload_1 
    2: invokevirtual #33; //Method apply:(I)Ljava/lang/Object; 
    5: invokestatic #83; //Method scala/runtime/BoxesRunTime.unboxToDouble:(Ljava/lang/Object;)D 
    8: dreturn 

ऐसा लगता है कि सरणी विशिष्ट नहीं हैं जो मूर्खतापूर्ण लगती हैं, क्योंकि एरे जेवीएम पर विशिष्ट हैं।

क्या कुछ ऐसा है जो मैं अभी भी अपने लक्ष्य तक पहुंचने के लिए कर सकता हूं?

+0

आप किस संस्करण का उपयोग कर रहे हैं? यह 2.9.2 के साथ मेरे लिए ठीक लग रहा है। –

+0

मैंने 2.9.2 और 2.8.2 दोनों के साथ प्रयास किया। – paradigmatic

उत्तर

9

आप शायद Vec.class में संकलित कोड को देख रहे हैं। this thread के अनुसार उप-वर्गों में विशेषज्ञता होती है। यह आरईपीएल में सत्यापित किया जा सकता:

scala> class Vec[@specialized A] (ary: Array[A]) { 
    | def apply(i: Int) = ary(i) 
    | } 
defined class Vec 

scala> new Vec(Array[Int](1)).getClass 
res0: java.lang.Class[_ <: Vec[Int]] = class Vec$mcI$sp 

आप देख सकते हैं Int के लिए यह उपवर्ग Vec$mcI$sp उपयोग कर रहा है। और यदि आप उस वर्ग पर जावप चलाते हैं तो आप देखेंगे कि यह वास्तव में कोड को ठीक से विशेषज्ञता दे रहा है। यह वही विधि लग रहा है लागू Vec$mcI$sp.class में तरह javap उपयोग कर रहा है:

public int apply(int); 
    flags: ACC_PUBLIC 
    Code: 
     stack=2, locals=2, args_size=2 
     0: aload_0  
     1: iload_1  
     2: invokevirtual #13     // Method apply$mcI$sp:(I)I 
     5: ireturn  

कौन सा मुझे लगता है कि आप क्या चाहते हैं जब Int का उपयोग कर रहा है।