0Pricing
Ruby Academy · درس

تحسين الذاكرة

تقليل عمليات التخصيص

تحسين الذاكرة درس مجاني في Ruby Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Ruby Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Ruby Academy 4 دروس في المجموع.

لماذا تهم الذاكرة؟

تستهلك كل قطعة كائن تنشئها Ruby ذاكرةً وتضيف عملًا إلى جمع المهملات. ويعني تقليل التخصيصات برامج أسرع وأخف.

  • يوقف GC التنفيذ لاستعادة الكائنات
  • تؤدي معدلات التخصيص المرتفعة إلى تشغيل GC مرات أكثر
  • غالبًا ما يكون تقليل التخصيصات أكبر مكسب ممكن
before = GC.stat(:total_allocated_objects)
100.times { 'new string' + '!' }
after = GC.stat(:total_allocated_objects)
puts "Allocated: #{after - before} objects"

حساب التخصيصات

تكشف GC.stat عدادات التخصيص التي يمكنك طرح قيمها قبل كتلة وبعدها.

  • تزداد قيمة :total_allocated_objects باستمرار
  • اطرح قيمة ما قبل القياس من قيمة ما بعده لقياس قسم معين
def allocations
  before = GC.stat(:total_allocated_objects)
  yield
  GC.stat(:total_allocated_objects) - before
end

puts allocations { Array.new(1000) { |i| i.to_s } }

السلاسل النصية المُجمَّدة

يؤدي تكرار السلاسل النصية الحرفية إلى تخصيص كائن جديد في كل مرة. يتيح تجميدها لـ Ruby إعادة استخدام نسخة واحدة غير قابلة للتغيير.

  • أضيفوا التعليق السحري في أعلى الملف
  • أو استدعوا .freeze لكل سلسلة حرفية على حدة
# frozen_string_literal: true

s1 = 'hello'
s2 = 'hello'
puts s1.equal?(s2)

تجنّبوا التخصيصات داخل الحلقات

يؤدي إنشاء الكائنات داخل الحلقات المكثفة إلى مضاعفة عدد التخصيصات. انقلوا الثوابت إلى خارجها.

  • أنشئوا التعبيرات النمطية والمصفوفات والسلاسل النصية مرة واحدة
  • أعيدوا استخدامها في جميع التكرارات
PATTERN = /\d+/

def count_numbers(lines)
  lines.count { |line| line.match?(PATTERN) }
end

puts count_numbers(['a1', 'bb', 'c3'])

الأساليب المُعدِّلة (bang)

تُعيد الأساليب التي لا تحمل اللاحقة bang كائنات جديدة، بينما تعدّل أساليب bang الكائنات في مكانها، مما يوفر عمليات تخصيص.

  • map! وgsub! وsort!
  • استخدموها فقط عندما يكون تعديل الكائن الأصلي آمنًا
arr = [3, 1, 2]
arr.sort!
puts arr.inspect

s = 'hello world'
s.upcase!
puts s

الرموز أم السلاسل النصية كمفاتيح

الرموز مُدخلة في جدول الرموز؛ فالرمز نفسه يكون كائنًا مشتركًا واحدًا. استخدموها كمفاتيح للـ Hash.

  • تُخصَّص سلسلة نصية جديدة لمفاتيح السلاسل النصية في كل مرة
  • توفر الرموز الذاكرة عند تكرار عمليات البحث
puts :name.equal?(:name)
puts 'name'.equal?('name')

المكررات الكسولة

يؤدي تسلسل map وselect إلى إنشاء مصفوفات وسيطة. تعالج lazy العناصر واحدًا تلو الآخر.

  • لا تُخصَّص مجموعات وسيطة
  • مناسبة جدًا للتسلسلات الكبيرة أو اللانهائية
result = (1..Float::INFINITY).lazy
  .select { |n| n.even? }
  .map { |n| n * n }
  .first(5)
puts result.inspect

التدفق بدلًا من التحميل

تُعد قراءة ملف كامل في الذاكرة تبديدًا للموارد. استخدموا التدفق لمعالجة الملف سطرًا بسطر بدلًا من ذلك.

  • تعالج each_line سطرًا واحدًا في كل مرة
  • استهلاك ثابت للذاكرة بغض النظر عن حجم الملف
text = "line1\nline2\nline3"
text.each_line do |line|
  puts line.strip.upcase
end

ضم السلاسل النصية

يؤدي بناء السلاسل النصية باستخدام + داخل حلقة إلى تخصيص سلسلة جديدة في كل مرة. استخدموا << للإلحاق في مكانه.

  • ينشئ + كائنًا جديدًا
  • يعدّل << المخزن المؤقت الموجود
buffer = String.new
5.times { |i| buffer << "item#{i} " }
puts buffer

تجميع الكائنات وإعادة استخدامها

أعيدوا استخدام الكائنات المكلفة بدلًا من إنشائها من جديد.

  • خزّنوا إعدادات التحليل أو التعبيرات النمطية المُجمَّعة مؤقتًا
  • استخدموا قيمة ثابتة أو قيمة محفوظة مؤقتًا
def config
  @config ||= { host: 'localhost', port: 4567 }
end

puts config.equal?(config)

تشغيل GC لفهم السلوك

يمكنكم فحص سلوك GC للتحقق من التحسينات.

  • تُظهر GC.stat(:count) عدد مرات تشغيل GC
  • يُعد انخفاض عدد مرات التشغيل بعد التحسين علامة جيدة
start = GC.stat(:count)
50_000.times { |i| [i] }
puts "GC runs: #{GC.stat(:count) - start}"

اختبار سريع

اختبروا معرفتكم بتحسين استخدام الذاكرة.

مراجعة

تعلّمتم كيفية تحسين استخدام الذاكرة:

  • عدّوا التخصيصات باستخدام GC.stat
  • جمّدوا السلاسل النصية الحرفية وأعيدوا استخدام الكائنات
  • فضّلوا أساليب bang و<< لتجنّب إنشاء كائنات جديدة
  • استخدموا الرموز للمفاتيح والمكررات الكسولة في سلاسل المعالجة
  • عالجوا البيانات الكبيرة بالتدفق بدلًا من تحميلها كلها

ستتناولون بعد ذلك اختناقات الأداء الشائعة.

الأسئلة الشائعة

هل درس «تحسين الذاكرة» مجاني؟

نعم — نص درس «تحسين الذاكرة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Ruby Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Ruby Academy 4 دروس في المجموع.

ماذا ستتعلم في «تحسين الذاكرة»؟

تقليل عمليات التخصيص تتمرن على Ruby Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Ruby Academy؟

لا تُشترط خبرة سابقة. Ruby Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «تحسين الذاكرة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Ruby Academy هذا؟

نعم. كل درس في Ruby Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. قياس الأداء
  2. أدوات تحليل الأداء
  3. تحسين الذاكرة
  4. الاختناقات الشائعة
← العودة إلى Ruby Academy