رموز روبي لا يتم جمع القمامة !؟إذن، أليس من الأفضل استخدام سلسلة؟

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

سؤال

إذا قمت بإنشاء 10000 سلسلة في حلقة، فيجب إجراء الكثير من عمليات جمع البيانات المهملة، مما يستهلك الكثير من الموارد.

إذا فعلت الشيء نفسه مع الرموز، فإنك تقوم بإنشاء كائنات لا يمكن جمع القمامة.

ايهما الأسوأ؟

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

المحلول 2

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

وعلى نحو مماثل، تحتاج سلاسل لتكون فريدة من نوعها في روبي. ويرجع ذلك إلى الطريقة التي اعتدنا هذا - معالجة النصوص وغيرها

وتقرر أي واحد لاستخدام اعتمادا على معاني الكلمات، لا تحسين قبل الأوان.

نصائح أخرى

إذا كنت تشير إلى نفس الرمز في حلقة الخاص بك، ثم لم يكن لديك لإعادة أي بمعنى أن الكائن في كل مرة.

while i < 10000
  i += 1
  :im_using_this_symbol_here
end

والآن إذا كنت تستخدم سلسلة هناك بدلا من ذلك، السلسلة سيتم إعادة 10K مرات. بشكل عام، استخدم الرموز في الحالات التي تقريبا علاج حرفي مثل ثابت أو مفتاح. وخير مثال للغاية بالنسبة لي أن يكون

link_to "News", :action => 'news'

وبدلا من

link_to "News", "action" => 'news'

والإجراءات التي يجري إعادة استخدامها مرارا وتكرارا داخل التطبيق الخاص بك.

إذا كنت تستخدم Ruby 2.2.0 أو إصدار أحدث، فينبغي عادةً أن يكون من المقبول إنشاء الكثير من الرموز ديناميكيًا، لأنها سيتم تجميعها وفقًا لـ إعلان روبي 2.2.0-preview1, ، والذي يحتوي على رابط ل مزيد من التفاصيل حول الرمز الجديد GC.ومع ذلك، إذا قمت بتمرير رموزك الديناميكية إلى نوع ما من التعليمات البرمجية التي تحولها إلى معرف (مفهوم تنفيذ روبي داخلي مستخدم في كود مصدر C)، ففي هذه الحالة سيتم تثبيته ولن يتم جمع البيانات المهملة أبدًا.لست متأكدًا من مدى شيوع حدوث ذلك.

عند اتخاذ قرار بشأن استخدام الرموز أو السلاسل، يجب عليك مراعاة ما يلي:

  • لا يمكن تغيير الرموز بعد إنشائها.
  • لا تحتوي الرموز على الكثير من الأساليب التي تمتلكها السلاسل، مثل start_with?
  • يمكن مقارنة الرموز مع بعضها البعض بكفاءة عالية لتحقيق المساواة.
  • من المفترض أن تمثل الرموز اسم شيء ما وفقًا لـ مستندات الرمز.لن أستخدمها لتخزين أي شيء لا يمكن اعتباره اسمًا.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top