تخطَّ إلى المحتوى

ميم مقابل C وZig

مصدر أرقام المقارنة بـ C «التحليل التقني لميم 0.9.1» في مستودع المجمّع، وما تغيّر في 0.10.0 من قسم 0.10.0 في docs/performance.md هناك. كل رقم لميم وC مقيس: البرنامج نفسه بالخوارزمية نفسها، يُشغَّل خمس مرات ويؤخذ الوسيط. أما Zig فلم يكن مثبتاً على جهاز القياس، فكل ما يخصه هنا من وثائقه، غير مقيس.

الثواني وسيط زمن التنفيذ للملف المبني بميم 0.9.1، و«أفضل C» أسرع gcc -O2 وclang -O2:

البرنامج ميم (ساكن) ميم (حركي) أفضل C النسبة إلى أفضل C
حلقة عددية (300 مليون دورة) 0.771 0.617 0.696 ×0.89 (أسرع)
n-body بمصفوفات ثابتة 0.244 0.239 0.226 ×1.06
غربال حتى 20 مليوناً 0.429 0.366 0.265 ×1.38–1.62
قاموس: مليون مفتاح 0.289 0.318 0.194 ×1.49
n-body بقوائم 0.415 0.414 0.210 ×1.98
بناء نص (400 ألف قطعة) والبحث فيه 0.291 0.286 0.118 ×2.43
فيبوناتشي العودية (ن=40) 0.925 0.988 0.298 ×3.10

ما تغيّر في 0.10.0: صار meem build يولّد الشيفرة بنموذج الذاكرة الصغير، فنزلت فيبوناتشي العودية على برامج القياس في مستودع المجمّع من 1.014 ث إلى 0.762 ث (أسرع بـ 25%)، والبقية في حدود ±10%. لم تُعَد المقارنة بـ C على 0.10.0، فالنسبة الحقيقية للعودية الآن أقل من ×3.10، ولا نعرف رقمها.

كيف تُقرأ: حيث البيانات أعداد في مصفوفات ثابتة، ميم بمستوى C (LLVM يولّد الشيفرة نفسها تقريباً). وتتأخر في ثلاثة مواضع:

  • العودية: فحص التجاوز على كل جمع، وكان الاستدعاء غير مباشر حتى 0.9.1 (أُصلح في 0.10.0، انظر أعلاه).
  • القوائم في الحلقات: كل وصول يقرأ رأس القائمة وطولها ثم يفحص الحد، ولا معلومات تسمح لـ LLVM برفع ذلك خارج الحلقة.
  • النصوص: كل + يبني نصاً جديداً كاملاً، والمؤقتات تبقى حتى الخروج: ذروة 138 م.ب مقابل 10.6 لـ C في برنامج النصوص.

والحلقة العددية الأسرع من gcc ميزة LLVM لا ميزة ميم (clang قريب منها). والقياس على جهاز غير خالٍ (Intel i3، الحمل بين 1.35 و5.2)، والفروق الأصغر من 10% لا يُعتدّ بها.

ميم 0.9.1 ميم 0.10.0
«مرحبا» فحص 0.34 ث، بناء 0.40 ث؛ الملف 30592 بايتاً ساكناً، و6504 حركياً الملف 29640 بايتاً ساكناً، و6488 حركياً
ملف 50 ألف سطر بين دقيقة ودقيقتين للبناء، و1.35 غ.ب ذاكرة للمجمّع؛ 9.3 م.ب 57 ث بلا تحسين (فوق العتبة)؛ 6.7 م.ب
عتبة التحسين في meem build 5000 كتلة (نحو 1400 سطر) 25 ألف كتلة (نحو 7000 سطر)
زمن البدء نحو 0.34 ث لأي أمر (تحميل بايثون وLLVM)
الجانب ميم 0.10.0 C Zig (غير مقيس)
الذاكرة يدوية بمخصصات صريحة وساحات وخاتمه؛ الكاشف افتراضي في التشغيل المباشر ويكشف الاستعمال بعد التحرير والتحرير المزدوج، والملف المبني بلا كاشف لا يكشفهما عبر اسم آخر يدوية بلا فحص يدوية بمخصصات صريحة وdefer؛ مخصص التنقيح يكشف التسرب والتحرير المزدوج
الحدود والتجاوز مفحوصان دائماً إلا بلا_فحص لا فحص مفحوصان في وضعي Debug وReleaseSafe
الأخطاء !نوع وجرّب ووالا؛ خطأ بلا بيانات رموز إرجاع وerrno مجموعات أخطاء في النوع، وتتبّع
وقت الترجمة لا تنفيذ وقت الترجمة المعالج القبلي comptime كامل
العمومية لا أنواع معمَّمة ماكرو وvoid * comptime
استدعاء C خارجي بأنواع محددة؛ لا هياكل بالقيمة ولا ترويسات أصلي يستورد ترويسات C مباشرة
المنصات لينكس x86_64 وحده كل شيء عشرات الأهداف
أدوات التنقيح الكاشف و--debug-mem، وفحص بـ JSON، و--fix؛ لا DWARF ولا مصحّح gdb وvalgrind وsanitizers DWARF وLSP
النضج أسابيع، ومطوّر واحد عقود سنوات، قبل 1.0
العربية الكلمات والرسائل عربية، والنص UTF-8 لا لا

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

وما تتأخر فيه: الأداء في الحالات العامة (القوائم والعودية والنصوص)، وزمن الترجمة، والمنصات، والتنقيح، والعمومية، واستدعاء C، والبيئة، والنضج، وضمان الذاكرة في الملف المبني. ميم 0.10.0 ليست بديلاً لـ C ولا Zig في البرمجة النظامية اليوم.

ماذا تستطيع ميم وما لا تستطيع · ابدأ من C · ابدأ من Zig · الأداء (قياسات 0.5–0.6)