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



Answers

أنت تحاول micro-optimize هنا ، وهذا بشكل عام ليس كبيرًا. ما لم يكن لديك تحليلات الأداء التي توضح لك أن هذه مشكلة ، فلا يستحق حتى تغييرها.

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

على الرغم من ذلك ، على سبيل المثال ، فإن IL الخاص بمشغل التلاشي هو:

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 

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

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 

بالنسبة لعامل التجميع الخالي ، إذا كانت القيمة null ، فسيتم تنفيذ ستة من العبارات ، بينما يتم تنفيذ أربع عمليات باستخدام switch .

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

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

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

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

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

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
}

سيكون تفضيلاتي للقراءة هو عامل التوحيد الخالي ، فأنا لا أريد أن يؤثر ذلك على الأداء.




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

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




من أجل مناقشة المناقشة ... إذا كان / then / else يعمل بنفس السرعة مثل: العملية الثلاثية بالسرعة مثل بيان تبديل / حالة مستوى واحد.

فيما يلي بعض مقاييس الأداء مع رمز C #.

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

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;
    }





Links