سؤال

أنا واحد غريب المشكلة.لدي قطعة التالية من التعليمات البرمجية:

template<clss index, class policy>
inline int CBase<index,policy>::func(const A& test_in, int* srcPtr ,int* dstPtr)
{
    int width = test_in.width();
    int height = test_in.height();

    double d = 0.0; //here is the problem
    for(int y = 0; y < height; y++)
    {

        //Pointer initializations

        //multiplication involving y
        //ex: int z = someBigNumber*y + someOtherBigNumber;
        for(int x = 0; x < width; x++)
        {
            //multiplication involving x
        //ex: int z = someBigNumber*x + someOtherBigNumber;
            if(soemCondition)
            {
                // floating point calculations
            }
            *dstPtr++ = array[*srcPtr++];
        }
    }
}

الحلقة الداخلية يعدم ما يقرب من 200 ، 000 مرات و وظيفة كاملة يأخذ 100 مللي على الانتهاء.( لمحة عن استخدام AQTimer)

لقد وجدت غير المستخدمة متغير double d = 0.0; خارج الحلقة الخارجية وإزالة نفسه.بعد هذا التغيير فجأة طريقة أخذ 500ms لنفس عدد من عمليات الإعدام.( 5 مرات أبطأ).

هذا السلوك هو استنساخه في مختلف الأجهزة مع معالج مختلف الأنواع.(Core2, dualcore المعالجات).

أنا باستخدام VC6 مترجم مع تحسين مستوى O2.Follwing هي الأخرى خيارات برنامج التحويل البرمجي المستخدمة :

 -MD -O2 -Z7 -GR -GX -G5 -X -GF -EHa

توقعت مترجم التحسينات و إزالة المترجم الأمثل /O2.بعد أن أصبحت وظيفة طبيعية فمن أخذ 100ms حسب القانون القديم.

يمكن لأي شخص أن يلقي بعض الضوء على هذا السلوك الغريب?

لماذا مترجم الأمثل ينبغي أن تبطئ أداء عند إزالة غير المستخدمة متغير ؟

ملاحظة:رمز التجميع (قبل و بعد التغيير) بدا نفسه.

لا يوجد حل صحيح

نصائح أخرى

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

VC6 هو عربات التي تجرها الدواب كما الجحيم.ومن المعروف أن توليد رمز غير صحيح في العديد من الحالات ، محسن ليست متقدمة أيضا.المترجم هو أكثر من عقد من الزمن القديم ، لم يؤيد لسنوات عديدة.

ذلك حقا, الجواب هو "أنت باستخدام عربات التي تجرها الدواب مترجم.نتوقع عربات التي تجرها الدواب السلوك, وخاصة عندما تحسينات ممكنة."

أنا لا أفترض الترقية إلى الحديث المترجم (أو ببساطة اختبار التعليمات البرمجية على أحد) هو الخيار ؟

ومن الواضح أن إنشاء الجمعية لا يمكن أن يكون نفس ، أو لن يكون هناك أي الفارق في الأداء.

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

تعلن width و height كما const {غير} [إينتس].{على غير موقعة ينبغي أن تستخدم منذ مرتفعات وعرض أبدا السلبية.}

const int width = test_in.width();
const int height = test_in.height();

وهذا يساعد المترجم مع تحسين.مع القيم const, ، فإنه يمكن وضعها في المدونة أو في السجلات ، مع العلم أنها لن تتغير.كما أنه يخفف مترجم من الحاجة إلى تخمين ما إذا كانت المتغيرات تتغير أو لا.

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

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