使用具有复杂检查的局部变量的多个 &&s 的 C# 性能 - 编码风格与性能

C# performance of multiple &&s using local variable with complex checks - coding style vs performance

我有以下代码:

    using System;
public static class C {
    public static bool WhatIsFaster(object someObject) {
       var isHttpRequest = IsHttpRequest(someObject);
       var userIsKnown = RequestorIsInDatabase(someObject);
       var parameterIsInChecklist = RequestParametersIsInCheckList(someObject);
       var permissionGranted = AskPersmissionServerice(someObject);
       return isHttpRequest && userIsKnown && parameterIsInChecklist && permissionGranted;

        //return GetValue1() && GetValue2() && GetValue3();
    }

    public static bool IsHttpRequest(object someObject){
        //Check the kind of request
        return true;
    }

    public static bool RequestorIsInDatabase(object someObject){
        //Check if the user from the reqeust is known
        return true;
    }

    public static bool RequestParametersIsInCheckList(object someObject){
        //Check if the parameters is in the check list
        return true;
    }

    public static bool AskPersmissionServerice(object someObject){
        //Check if the user has permission for this
        return true;
    }

}

注释掉的方式要快很多,因为方法的执行只有在上一次执行返回true的时候才执行。使用额外的局部变量使代码更具可读性。

将这个简单的示例变成具有更多参数和评估方法的更复杂的示例,我不确定如何实现它。我正在寻找的实现需要非常高效,因为对此代码的请求量非常高,而一些对评估方法 (GetValueX-Methods) 的请求可能需要比其他代码更长的时间。

我在想如果嵌套'ifs'可能会更好,但它会增加复杂性和可维护性。特别是,如果我认为最终评估可能会因更多的评估方法和不同的逻辑包含(XOR、OR)而变得更加复杂。

您认为有哪些方法或其他方法可以对此进行优化并且仍然具有良好的可读性和可维护性代码?

测量花费最多时间的方法,然后像@stuartd 提到的那样构造代码

if(!LessTimeToExecuteMethod())
   return false;

if(!NextWithLessTimeToExecuteMethod())
   return false;

...

//last one
if(!TheMostTimeToExecute())
   return false;

return true;

您在注释代码中看到的效果正在发生,因为像

这样的语句
bool result = a && b && c ;//and so on ...

计算到第一次出现false。

当你分别计算每个 a、b、c 时,你的性能会最差。

您可以使用扩展方法链接 结果:

public static class Extensions
{
    public static bool And(this bool @this, Func<bool> func) => @this && func();
}

用法:

static void Main(string[] args)
{
    True().And(True).And(True).And(False).And(True);
}

static bool True() => true;
static bool False() => false;

第一个方法你正常执行,然后通过扩展方法调用其他方法。在上面的示例中,最后一个 true 将不会被调用。

应该可以添加参数作为扩展方法参数,我会把这个留给你;) 或者只是通过 lambdas 调用方法(有点慢)。