2013-02-06 15 views
12

मैं एक परिवर्तनीय Buffer का उपयोग कर रहा हूं और यह पता लगाने की आवश्यकता है कि उसके कितने तत्व हैं।स्कैला बफर: आकार या लंबाई?

size और length विधियों को अलग-अलग लक्षणों से विरासत में परिभाषित किया गया है।

क्या कोई वास्तविक प्रदर्शन अंतर है, या क्या उन्हें सटीक समानार्थी माना जा सकता है?

+2

मैं व्यक्तिगत रूप से एक अर्थपूर्ण नाइट-पिकर हूं, इसलिए मैं केवल उन चीजों के लिए 'लंबाई' का उपयोग करता हूं जो रैखिक या अनुक्रमिक और 'आकार' अन्यथा हैं। –

उत्तर

15

वे समानार्थी शब्द, ज्यादातर Array और String के लिए संग्रह के लिए size और length होने के जावा के फैसले का परिणाम हैं। एक को हमेशा दूसरे के संदर्भ में परिभाषित किया जाएगा, और आप आसानी से देख सकते हैं कि स्रोत कोड को देखकर कौन सा है, जिसके लिए स्कालाडोक पर लिंक प्रदान किया गया है। बस परिभाषित विशेषता ढूंढें, स्रोत कोड खोलें, और def size या def length खोजें।

+0

धन्यवाद! मुझे नहीं पता था कि स्केलाडोक के माध्यम से स्रोत कोड ऑनलाइन पहुंच योग्य था। यह बहुत अच्छा है! – Eduardo

2

वे Buffer.size राज्यों के लिए scaladoc के रूप में, समानार्थक शब्द हैं:

इस बफर के आकार, लंबाई के बराबर है। बफर की लंबाई

:

scaladoc Buffer.length के लिए स्पष्ट भी है। नोट: xs.length और xs.size एक ही परिणाम उत्पन्न करते हैं।

सरल सलाह: प्रश्न पूछने से पहले स्कैलाडोक देखें।

अद्यतन: बस आपके संपादन को प्रदर्शन का उल्लेख जोड़ते हुए देखा। डैनियल सी सोब्राल सहायता के रूप में, आमतौर पर एक दूसरे की अवधि में हमेशा लागू होता है, इसलिए उनके पास समान प्रदर्शन होता है।

+0

मैं वास्तव में सोच रहा था कि क्या कोई प्रदर्शन अंतर था? उदाहरण के लिए, डेटा संरचना में एक वास्तविक विशेषता के रूप में संग्रहीत किया जाता है, वही मूल्य जो सभी मानों (जैसे किसी सूची के साथ) को समान मूल्य लौटने के लिए लूप करना पड़ता है। – Eduardo

+0

मैंने अपने प्रश्न को अधिक स्पष्ट – Eduardo

5

इस मामले में, उन्हें समानार्थी माना जा सकता है। आप Array जैसे कुछ अन्य मामलों के साथ देखना चाह सकते हैं - जबकि स्केल 2.10 से पहले के संस्करणों में लंबाई और आकार हमेशा एक ही परिणाम लौटाएगा, size पर कॉल करने के लिए मुक्केबाजी ओवरहेड हो सकता है (जो आसपास के स्कैला रैपर द्वारा प्रदान किया जाता है ऐरे), जबकि length अंतर्निहित जावा ऐरे द्वारा प्रदान किया जाता है।

स्कैला 2.10 में, इस ओवरहेड को size विधि प्रदान करने वाले मूल्य वर्ग के उपयोग से हटा दिया गया है, इसलिए आपको अपनी पसंद की विधि का उपयोग करने में स्वतंत्र महसूस होना चाहिए।

+0

के रूप में संपादित किया है, मैंने अभी स्केल 2.11 कोड का प्रोफाइल किया है, और सरणी पर 'आकार' को कॉल करने से ऑब्जेक्ट बनाता है। आपको प्रदर्शन-महत्वपूर्ण कोड में अभी भी इससे बचना चाहिए। – mattg

2

स्कैला-2.11 के अनुसार, इन विधियों के पास अलग-अलग प्रदर्शन हो सकते हैं। देता 2423834 के बारे में nanos समय (समय-समय पर बदलती रहती है) मेरी amd64 कंप्यूटर पर इस रनिंग

val bigArray = Array.fill(1000000)(0) 
val beginTime = System.nanoTime() 
var i = 0 
while (i < 2000000000) { 
    i += 1 
    bigArray.length 
} 
val endTime = System.nanoTime() 
println(endTime - beginTime) 
sys.exit(-1) 

: उदाहरण के लिए, इस कोड पर विचार करें।

अब, अगर मैं length विधि size पर बदलता हूं, तो यह लगभग 7076471 9 नैनो समय बन जाएगा।

यह 20x धीमी से अधिक है।

ऐसा क्यों होता है? मैंने इसे खोद नहीं दिया, मुझे नहीं पता।लेकिन परिदृश्य हैं जहां length और size काफी भिन्न प्रदर्शन करते हैं।

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