سؤال

أنا أقرأ من خلال K&R جاء إلى قسم صغير على تسجيل المتغيرات, و أتساءل عما إذا كان الناس هنا بعض الأمثلة على هذا في الممارسة العملية.

من قسم 4.7 K&R:

سجل الإعلان يبدو
سجل int x;
سجل char c;

أن تكون واضحة, أنا فقط أتمنى أن أرى بعض بارد نماذج التعليمات البرمجية.أنا (أنا متأكد من أن كنت) فهم الموضوع حتى لا تشعر بالحاجة إلى نوع حتى مطول تفسير (إلا إذا كنت تريد).

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

المحلول

لا يوجد مثال جيد لاستخدام التسجيل عند استخدام المترجمين الحديثين (اقرأ:آخر 15 عامًا أو أكثر) لأنه لا يؤدي أبدًا إلى أي شيء جيد ويمكن أن يفعل بعض الأشياء السيئة.عندما تستخدم التسجيل، فإنك تخبر المترجم "أعرف كيفية تحسين الكود الخاص بي بشكل أفضل مما تفعله" وهو ما لا يحدث أبدًا.يمكن أن يحدث أحد الأشياء الثلاثة عند استخدام التسجيل:

  • يتجاهلها المترجم، وهذا على الأرجح.في هذه الحالة الضرر الوحيد هو أنه لا يمكنك أخذ عنوان المتغير في الكود.
  • يحترم المترجم طلبك ونتيجة لذلك يعمل الكود بشكل أبطأ.
  • يحترم المترجم طلبك ويعمل الكود بشكل أسرع، وهذا هو السيناريو الأقل احتمالاً.

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

نصائح أخرى

على العموم أنا أتفق مع روبرت, ، ولكن كأي قاعدة جيدة، فإن لهذه القاعدة استثناءات أيضًا.
إذا كنت تعمل على نظام مضمن بعمق، فقد تعرف أفضل من المترجم كيفية تحسين الكود من أجله تطبيقك المحدد على بنية الأجهزة المحددة لديك.

ولكن في 99% من الحالات، يكون تفسير روبرتس جيدًا للكلمات المضمنة أيضًا.

أعلم أن هذا منذ فترة طويلة، ولكن هنا تنفيذ إجراء فرعي من heapsort حيث يؤدي استخدام متغيرات التسجيل إلى جعل الخوارزمية أسرع، على الأقل باستخدام gcc 4.5.2 لتجميع التعليمات البرمجية

inline  void max_heapify(int *H, int i){
    char OK = FALSE;
    register int l, r, max, hI;
    while(!OK){
        OK = TRUE;
        l = left(i);
        r = right(i);
        max = i;
        if(l <= H[SIZE] && H[l] > H[i]){
            max = l;
        }
        if(r <= H[SIZE] && H[r] > H[max]){
            max = r;
        }
        if(max != i){
            OK = FALSE;
            hI = H[i];
            H[i] = H[max];
            H[max] = hI;
            i = max;
        }
    }
}

لقد اختبرت الخوارزمية باستخدام الكلمة الأساسية للتسجيل وبدونها قبل السمات وقمت بتنفيذها لفرز مصفوفة عشوائية تحتوي على 50,000,000 عنصر في دفتر ملاحظاتي، عدة مرات لكل إصدار.

أدى استخدام السجلات إلى تقليل وقت فرز الكومة من ~ 135 ثانية إلى ~ 125 ثانية.

لقد اختبرت أيضًا 5,000,000 عنصر فقط، لكني قمت بتنفيذها مرات أكثر.

بدأ الإصدار بدون السجل عند 11 ثانية ولكن كل تنفيذ خفض الوقت حتى وصل إلى 9,65 ثانية وتوقف عنده

بدأ الإصدار المزود بالسجل عند 10 ثوانٍ وخفض الوقت حتى 8,80 ثانية.

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

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

نأمل أن يكون مفيدًا لشخص ما، تحياتي.

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

يرى vmgen — مولد مترجمين فوريين فعالين للآلة الافتراضية للحصول على مثال للتحسين (5.2 أعلى التخزين المؤقت للمكدس).

الأولى هي تسجيل متغير يجب أن يكون استخدام بشدة استخدام المتغيرات مثل حلقة التحكم المتغير لتعزيز الأداء من خلال تقليل وقت الوصول.الثانوية يمكنك استخدام فقط سجل تخزين محدد في هذه الحالة مثل متعة (السيارات int a,السيارات الباحث ب) :خطأ متعة (سجل int a,سجل الباحث ب) :الحق فقط هذا من شأنه أن يكون تشغيل متعة (static int a,static int b) :خطأ متعة (extern int a,extern int b) :خطأ

حسنًا، هذا سؤال يحتاج إلى إجابات متعددة نظرًا لوجود سياقات ترميز متعددة:من منظور اللغة عالية المستوى، والمستوى المتوسط ​​والمستوى المنخفض (وصولاً إلى التجميع) حيث يمكن للغة C استدعاء إجراءات التجميع.

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

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