ليست أجهزة الكمبيوتر الحديثة قوية بما يكفي للتعامل مع السلاسل دون الحاجة إلى استخدام الرموز (في روبي)

StackOverflow https://stackoverflow.com/questions/656441

سؤال

كل نص قرأته عن رموز روبي يتحدث عن كفاءة الرموز على الأوتار.لكن هذه ليست السبعينيات.يمكن لجهاز الكمبيوتر الخاص بي التعامل مع القليل من جمع البيانات المهملة الإضافية.هل انا مخطئ؟لدي أحدث وأكبر معالج بنتيوم ثنائي النواة و4 جيجا من ذاكرة الوصول العشوائي.أعتقد أن هذا يجب أن يكون كافيًا للتعامل مع بعض السلاسل.

هل كانت مفيدة؟

المحلول

وجهاز الكمبيوتر الخاص بك قد تكون قادرة على التعامل مع "قليلا من جمع القمامة إضافي"، ولكن ماذا عن عندما يأخذ أن "قليلا" مكان في حلقة الداخلية التي تدير ملايين المرات؟ ماذا عن عندما انها تعمل على نظام مضمن مع ذاكرة محدودة؟

وهناك الكثير من الأماكن التي يمكن أن تفلت من استخدام سلاسل طوعا أو كرها، ولكن في بعض كنت لا تستطيع ذلك. كل هذا يتوقف على السياق.

نصائح أخرى

وهذا صحيح، لا تحتاج الرموز بشكل سيء للغاية للغاية لأسباب الذاكرة. مما لا شك فيه أن جهاز الكمبيوتر الخاص بك التعامل مع جميع أنواع معالجة سلسلة نرلي.

ولكن، بالإضافة إلى كونها أسرع والرموز لديها ميزة إضافية (خاصة مع السياق التلوين) من يصرخ بصريا: انظروا ME، I AM A KEY OF زوج مفاتيح-VALUE. هذا سببا كافيا لاستخدامها بالنسبة لي.

وهناك أسباب أخرى أيضا ... وكسب الأداء على الكثير منهم قد يكون أكثر مما كنت أدرك، خصوصا تفعل شيئا مثل المقارنة.

عند المقارنة بين اثنين من رموز روبي، والمترجم هو مجرد المقارنة بين عنوانين الكائن. عند المقارنة بين سلسلتين، المترجم له لمقارنة كل حرف واحد في وقت واحد. هذا النوع من الحساب يمكن أن تضيف ما يصل إذا كنت تفعل الكثير من هذا.

ورموز لها مشاكل الأداء الخاصة بها على الرغم من ... هم أبدا القمامة التي تم جمعها.

وانها تستحق القراءة هذا المقال: HTTP: // شبكة الاتصالات العالمية .randomhacks.net / المواد / 2007/01/20/13-طرق من المظهر في واحد في روبي رمز

وانها لطيفة أن الرموز مضمونة فريدة من نوعها - التي يمكن أن يكون لها بعض الآثار لطيفة أنك لن تحصل من سلسلة (مثل عناوينهم دائما تساوي بالضبط أعتقد)

.

وبالإضافة إلى أنها لها معنى مختلف وكنت تريد استخدامها في مجالات مختلفة، ولكن روبي ليست صارمة جدا حول هذا النوع من الاشياء على أي حال، حتى أستطيع أن أفهم سؤالك.

إليك السبب الحقيقي لهذا الاختلاف:السلاسل ليست هي نفسها أبدًا.كل مثيل لسلسلة هو كائن منفصل، حتى لو كان المحتوى متطابقًا.وستتم معظم العمليات على الأوتار جديد كائنات السلسلة.خذ بعين الاعتبار ما يلي:

a = 'zowie'
b = 'zowie'
a == b         #=> true

على السطح، سيكون من السهل ادعاء ذلك a و b هي نفسها.ستعمل معظم العمليات المنطقية كما تتوقع.لكن:

a.object_id    #=> 2152589920 (when I ran this in irb)
b.object_id    #=> 2152572980
a.equal?(b)    #=> false

هم ينظر نفس الشيء، لكنهما كائنات مختلفة.كان على روبي تخصيص الذاكرة مرتين، وتنفيذ String#initialize الطريقة مرتين وهكذاإنهم يشغلون مكانين منفصلين في الذاكرة.ومهلا!يصبح الأمر أكثر متعة عندما تحاول تعديلها:

a += ''        #=> 'zowie'
a.object_id    #=> 2151845240

وهنا نضيف لا شئ ل a واترك المحتوى كما هو تمامًا -- لكن روبي لا تعرف ذلك.لا يزال يخصص كائن سلسلة جديدًا بالكامل، ويعيد تعيين المتغير a إليها، ويجلس كائن السلسلة القديم في انتظار جمع البيانات المهملة في نهاية المطاف.أوه، والفارغة '' تحصل السلسلة أيضًا على كائن سلسلة مؤقت مخصص فقط لمدة هذا السطر من التعليمات البرمجية.جربه وانظر:

''.object_id   #=> 2152710260
''.object_id   #=> 2152694840
''.object_id   #=> 2152681980

هل عمليات تخصيص الكائنات هذه سريعة على معالجك متعدد الجيجاهيرتز؟بالتأكيد هم كذلك.هل سيستهلكون الكثير من ذاكرة الوصول العشوائي (RAM) التي تبلغ سعتها 4 جيجابايت؟لا لن يفعلوا ذلك.لكن قم بذلك عدة ملايين من المرات، وسيبدأ في التراكم.تستخدم معظم التطبيقات سلاسل مؤقتة في كل مكان، وربما تكون شفرتك مليئة بالسلاسل الحرفية داخل الأساليب والحلقات.كل من هذه السلسلة الحرفية وما شابه سوف يخصص كائن سلسلة جديد، في كل مرة يتم تشغيل هذا السطر من التعليمات البرمجية.المشكلة الحقيقية ليست حتى في هدر الذاكرة؛إنه الوقت الضائع عندما يتم تشغيل مجموعة البيانات المهملة بشكل متكرر للغاية ويبدأ تطبيقك في التعليق.

في المقابل، ألقِ نظرة على الرموز:

a = :zowie
b = :zowie
a.object_id    #=> 456488
b.object_id    #=> 456488
a == b         #=> true
a.equal?(b)    #=> true

مرة واحدة الرمز :zowie يتم صنعه، ولن يصنع واحدًا آخر أبدًا.في كل مرة تشير فيها إلى رمز معين، فإنك تشير إلى نفس الكائن.ليس هناك وقت أو ذاكرة ضائعة على التخصيصات الجديدة.يمكن أن يكون هذا أيضًا جانبًا سلبيًا إذا كنت مجنونًا جدًا بهم - فهم كذلك أبداً تم تجميع البيانات المهملة، لذلك إذا بدأت في إنشاء عدد لا يحصى من الرموز ديناميكيًا من إدخال المستخدم، فإنك تخاطر بتسرب ذاكرة لا نهاية له.ولكن بالنسبة للأحرف البسيطة في التعليمات البرمجية الخاصة بك، مثل القيم الثابتة أو مفاتيح التجزئة، فهي مثالية تقريبًا.

هل هذا يساعد؟لا يتعلق الأمر بما يفعله تطبيقك مرة واحدة.يتعلق الأمر بما يفعله ملايين المرات.

وحرف واحد أقل لكتابة. هذا كل المبررات ولست بحاجة لاستخدامها على سلاسل للمفاتيح التجزئة، الخ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top