[C#] ؟: المشغل مقابل. إذا كان أداء البيان


Answers

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

للاستخدام العام، والإجابة الصحيحة هي كل ما هو أسهل للحفاظ على.

على الرغم من الجحيم من ذلك، فإن إيل لمشغل تحلل فارغة هو:

L_0001: ldsfld string ConsoleApplication2.Program::myString
L_0006: dup 
L_0007: brtrue.s L_000f
L_0009: pop 
L_000a: ldsfld string [mscorlib]System.String::Empty
L_000f: stloc.0 

و إيل للتبديل هو:

L_0001: ldsfld string ConsoleApplication2.Program::myString
L_0006: brfalse.s L_000f
L_0008: ldsfld string ConsoleApplication2.Program::myString
L_000d: br.s L_0014
L_000f: ldsfld string [mscorlib]System.String::Empty
L_0014: stloc.0 

أما بالنسبة إلى المشغل المتخلف ، في حالة عدم قيمة القيمة، يتم تنفيذ ستة من العبارات، بينما يتم تنفيذ أربع عمليات مع switch .

وفي حالة عدم وجود قيمة لا قيمة لها، يقوم المشغل المتراكم الفارغ بأربع عمليات مقابل خمس عمليات.

وبطبيعة الحال، يفترض هذا أن جميع عمليات إيل تأخذ نفس الوقت، وهذا ليس هو الحال.

على أي حال، نأمل يمكنك أن ترى كيف يمكن تحسين على هذا النطاق الصغير تبدأ في تقليل العائدات بسرعة كبيرة.

ومع ذلك، في نهاية المطاف، في معظم الحالات مهما كان أسهل للقراءة والمحافظة في هذه الحالة هو الجواب الصحيح.

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

Question

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

Command.Parameters["@EMAIL"].Value = email ?? String.Empty;

و

Command.Parameters["@EMAIL"].Value = (email == null) ? String.Empty: email;

و

if (email == null)
{
    Command.Parameters["@EMAIL"].Value = String.Empty
}
else
{
    Command.Parameters["@EMAIL"].Value = email
}

إن تفضيلي للقراءة سيكون عامل التجميع الفارغ، أنا فقط لا أريد أن يؤثر على الأداء.




وأظن أنه لن يكون هناك أي فرق الأداء.

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




للمناقشة ساكي ... إذا / ثم / آخر يعمل بأسرع ما؟: التشغيل الثلاثي بأسرع مستوى التبديل / بيان حالة واحدة.

في ما يلي بعض مؤشرات الأداء باستخدام رمز C #.

انها فقط عند البدء في الحصول على مستويات 2-3 عميق في تصريحات الحالة أن الأداء يبدأ أن تتأثر بشدة. وهذا هو، شيء من هذا القبيل مثال مثير للسخرية:

switch (x % 3)
    {
        case 0:
            switch (y % 3)
            {
                case 0: total += 3;
                    break;
                case 1: total += 2;
                    break;
                case 2: total += 1;
                    break;
                default: total += 0;
                    break;
            }
            break;
        case 1:
            switch (y % 3)
            {
                case 0: total += 3;
                    break;
                case 1: total += 2;
                    break;
                case 2: total += 1;
                    break;
                default: total += 0;
                    break;
            }
            break;
    case 2:
            switch (y % 3)
            {
                case 0: total += 3;
                    break;
                case 1: total += 2;
                    break;
                case 2: total += 1;
                    break;
                default: total += 0;
                    break;
            }
            break;
    default:
        switch (y % 3)
        {
            case 0: total += 3;
                break;
            case 1: total += 2;
                break;
            case 2: total += 1;
                break;
            default: total += 0;
                break;
        }
        break;
    }