2013-05-09 8 views
6

क्या रूबी में कक्षा के लिए आवंटित स्मृति के आकार को देखने का कोई तरीका है?बाइट्स में वर्ग का आकार

मैंने एक कस्टम क्लास बनाया है और मैं इसकी आकार को स्मृति में जानना चाहता हूं। तो क्या सी में sizeof() की समानता वाला कोई फ़ंक्शन है?

मैं बस इतना

test = MyClass.new 

की तरह एक नया वर्ग को प्रारंभ करने की कोशिश कर रहा हूँ और वर्ग है कि स्मृति के लिए आवंटित किया गया है के आकार का प्रिंट आउट के लिए एक विधि खोजने की कोशिश।

क्या यह रूबी में भी संभव है?

+0

इस प्रश्न के लिए कम से कम दो जटिलताएं हैं: 1) किसी ऑब्जेक्ट के सभी गुण अन्य वर्गों की वस्तुएं भी हैं, इसलिए आपको यह स्पष्ट करने की आवश्यकता है कि वे शामिल हैं या नहीं। 2) रूबी में इंस्टेंस वेरिएबल्स की संख्या और प्रकार गतिशील हैं, इसलिए वास्तव में कक्षा की स्मृति आकार जैसी कोई चीज़ नहीं है। हालांकि, आप सिद्धांत में वर्तमान में किसी ऑब्जेक्ट को आवंटित स्मृति को माप सकते हैं (हालांकि मुझे वर्तमान में यह नहीं पता कि कैसे, या यदि रूबी आपको ऐसा करने देता है)। –

उत्तर

6

कि सी

के रूप में एक ही तरह से एक वर्ग के आकार की गणना करता है एक वस्तु की स्मृति आकार कार्यान्वयन निर्भर है कोई भाषा सुविधा नहीं है। यह बेस क्लास ऑब्जेक्ट के कार्यान्वयन पर निर्भर करता है। उपयोग की गई स्मृति का आकलन करना भी आसान नहीं है। उदाहरण के लिए, यदि वे छोटे होते हैं तो तारों को आरस्ट्रिंग संरचना में एम्बेड किया जा सकता है, लेकिन यदि वे लंबे होते हैं तो ढेर में संग्रहीत किया जाता है (Never create Ruby strings longer than 23 characters)।

स्मृति कुछ वस्तुओं द्वारा उठाए गए विभिन्न गहरे लाल रंग का कार्यान्वयन के लिए सारणीबद्ध कर दिया गया है Memory footprint of objects in Ruby 1.8, EE, 1.9, and OCaml

अंत में, वस्तु आकार भी दो वस्तुओं के साथ एक ही कक्षा से, अलग हो सकता है, क्योंकि यह संभव है मनमाने ढंग से अतिरिक्त उदाहरण चर जोड़ने के लिए, हार्डकोडिंग के बिना क्या आवृत्ति चर मौजूद हैं। उदाहरण के लिए, instance_variable_get और instance_variable_set


आप एमआरआई रूबी 1.9.2+ का उपयोग करते हैं देखते हैं, वहाँ एक तरीका है आप कोशिश कर सकते हैं (चेतावनी दी है कि यह वस्तु का ही हिस्सा में दिख रही है है, इस से स्पष्ट है तथ्य यह है कि पूर्णांकों और तार शून्य आकार की और होता है):

irb(main):176:0> require 'objspace' 
=> true 
irb(main):176:0> ObjectSpace.memsize_of(134) 
=> 0 
irb(main):177:0> ObjectSpace.memsize_of("asdf") 
=> 0 
irb(main):178:0> ObjectSpace.memsize_of({a: 4}) 
=> 184 
irb(main):179:0> ObjectSpace.memsize_of({a: 4, b: 5}) 
=> 232 
irb(main):180:0> ObjectSpace.memsize_of(/a/.match("a")) 
=> 80 

तुम भी memsize_of_all कोशिश कर सकते हैं (ध्यान दें कि यह पूरे दुभाषिये की स्मृति उपयोग को देखता है, और एक चर अधिलेखित वर्ष प्रतिलिपि हटाने के लिए प्रकट नहीं होता है तत्काल):

irb(main):190:0> ObjectSpace.memsize_of_all 
=> 4190347 
irb(main):191:0> asdf = 4 
=> 4 
irb(main):192:0> ObjectSpace.memsize_of_all 
=> 4201350 
irb(main):193:0> asdf = 4 
=> 4 
irb(main):194:0> ObjectSpace.memsize_of_all 
=> 4212353 
irb(main):195:0> asdf = 4.5 
=> 4.5 
irb(main):196:0> ObjectSpace.memsize_of_all 
=> 4223596 
irb(main):197:0> asdf = "a" 
=> "a" 
irb(main):198:0> ObjectSpace.memsize_of_all 
=> 4234879 

आपको बहुत सावधान रहना चाहिए क्योंकि रूबी दुभाषिया कचरा संग्रह करने पर कोई गारंटी नहीं है। जबकि आप इसका परीक्षण और प्रयोग के लिए उपयोग कर सकते हैं, यह अनुशंसा की जाती है कि इसका उत्पादन में उपयोग न हो!

+0

इसके बारे में कैसे। क्या कक्षाओं की एक्स संख्या शुरू करना संभव है और फिर पहले और बाद में रूबी दुभाषिया के स्मृति उपयोग को खींचना संभव है? मैं एक समस्या में भाग रहा हूं जहां प्रत्येक सॉकेट को अपने स्वयं के धागे में 3 कक्षाओं (पैकेट हैंडलिंग और ऐसे) के लिए एक प्रतिलिपि मिल जाएगी, इसलिए यदि मेरे प्रत्येक वर्ग के 30 उदाहरण हैं तो 10 कनेक्शन हैं। मैं सोच रहा था कि यह एक मौलिक डिजाइन समस्या होगी और मुझे अपने पैकेट हैंडलिंग को फिर से सोचना/सोचना होगा, या यदि 3 वर्गों का परिणाम मिनेसिल मेमोरी उपयोग में होता है। –

+0

यह दिलचस्प परिणाम प्रदान कर रहा है, जब मैं बस 'ऑब्जेक्टस्पेस। Memsize_of_all' रखता हूं' मुझे '1180174' पर अनुमानित मूल्य मिलता है लेकिन जब मैं' (0..1000) चलाता हूं। प्रत्येक करें | i |; t.push PacketParser.new i; एंड 'और' ऑब्जेक्टस्पेस डालता है।memsize_of_all' मुझे '920578' मिलता है जो कि मेरी कक्षाओं में 3000 से अधिक शुरू किए बिना कम था। कचरा हैंडलिंग के अलावा, क्या मैं यहां कुछ खो रहा हूं? क्या यह वास्तव में 3000 कक्षाएं नहीं बना रहा है बल्कि बस 3 कक्षाओं या कुछ का संदर्भ दे रहा है? –

+0

मेरे उत्तर देने के लिए यह काफी असंभव है - आप प्रत्येक पुनरावृत्ति की जांच कर सकते हैं (शायद आप कुछ पुनरावृत्तियों में अचानक कमी देखेंगे)। आपको अवगत होना चाहिए कि आप न केवल उपरोक्त पुनरावृत्ति में अपनी वस्तुओं के लिए स्मृति आवंटित कर रहे हैं। पैकेटपार्सर कन्स्ट्रक्टर, और t.push विधि स्थानीय चर आवंटित भी कर सकती है जो (अस्थायी रूप से) स्मृति उपयोग को बढ़ाती है। – ronalchn

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