لماذا تقلل نقطة التوقف الشرطية من سرعة تنفيذ التطبيق في وقت التصحيح؟

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

سؤال

عندما أستخدم نقطة التوقف الشرطية في VS2005 بدلاً من استخدام التعليمات البرمجية المؤقتة للتحقق من شروط معينة، لاحظت أن الأمر يستغرق وقتًا أطول وتقل سرعة التنفيذ!!هل تعرف لماذا؟وكيفية حل هذه المشكلة؟

مثال:

    int sequence = atoi(m_SequenceNumber.GetAscii());
    if( sequence == 392914)//temporary code to check to step into code
    {
        int x = 0;//I put breakpoint here
    }

سيتم تنفيذ الكود السابق بشكل أسرع مما لو استخدمت نقطة توقف مشروطة مع (التسلسل == 392914)

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

المحلول

ومن الأفضل (إن أمكن) لاستخدام خدمات WatchPoint الذاكرة من نقطة توقف المشروطة. وتوقف الشرطي (كما أشار آخرون) لديه لتشغيل تعليمات برمجية إضافية في كل مرة مؤشر تنفيذ يذهب الماضي تلك المرحلة من أجل تحديد ما إذا كان من شأنه كسر أم لا - من الواضح أن هذا يستغرق وقتا إضافيا. A خدمات WatchPoint ذاكرة من نوع معين يحصل على استخدام بعض سجلات الأجهزة الخاصة - هناك حد لعدد watchpoints يمكنك تعيين هذا يمكن الحصول على تسارع، ولكن إذا كان يمكنك استخدامها هناك تقريبا أي عقوبة السرعة

ويتم تعيين خدمات WatchPoint الذاكرة باستخدام إطار نقطة توقف. لم تقم بتعيين على سطر من التعليمات البرمجية، ولكن بدلا من ذلك على عنوان في الذاكرة. وهذا يشير إلى محدودية واضحة، وأنها تعمل فقط من أجل الأشياء التي يمكن أن تتخذ في الواقع عنوان، مثل المتغيرات العالمية والمناطق المخصصة بشكل حيوي من الذاكرة (باستخدام new الخ). هل تقتصر في مقدار الذاكرة ويسمح لك لمشاهدة (على أساس وحدة المعالجة المركزية، وأعتقد أنك ربما الحصول على سجلات أكثر أو أقل الخاصة المخصصة).

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

نصائح أخرى

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

if ( condition ) Debugger.Break();

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

  • يحدد أن نقطة التوقف مشروطة
  • يقيم التعبير
  • إذا كان التعبير خاطئًا، فسيواصل مصحح الأخطاء التنفيذ
  • وإلا، فسيقوم مصحح الأخطاء بتسليم التحكم إليك

لذلك، حتى لو لم تشاهد نقطة التوقف مطلقًا (لأن الشرط لم يتم استيفاءه)، فقد يقوم مصحح الأخطاء بإدخال نقطة التوقف وتقييم الحالة آلاف المرات في الثانية (أو ربما أكثر).

وأفترض أنه لأنه يستغرق وقتا طويلا لتنفيذ الشرط. فإنه لا يزال أسرع بكثير من التنقل العدد اللازم من الأوقات الصعبة يدويا.

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

وهذا من شأنه أن يفسر بطريقة أو بأخرى لماذا يستغرق المزيد من الوقت. ولكن أنا مجرد تخمين.

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