评估顺序c#

cl0*_*l0h 6 c# linq

我查看了同事代码并告诉他Any出于性能原因重新排序以下Linq 谓词中的布尔比较.所以给定

public class JobResult
{
    public JobResult();

    public string Id{ get; set; }
    public StatusEnum Status{ get; set; }
    public string JobType{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

IList<JobResult> jobsList = _jobRepository.FetchJobs()
Run Code Online (Sandbox Code Playgroud)

我建议改变以下内容:

//Exit if there is already a job of type "PurgeData" running
if (jobsList.Any(job => job.Status == JobStatus.Running //1
                     && job.Id != currentJobId          //2
                     && job.JobType == "PurgeData")) //3
    return false;
Run Code Online (Sandbox Code Playgroud)

成为

//Exit if there is already a job of type "PurgeData" running
if (jobsList.Any(job => job.JobType == "PurgeData"      //3
                     && job.Status == JobStatus.Running  //1
                     && job.Id != currentJobId))             //2
    return false;
Run Code Online (Sandbox Code Playgroud)

我的理由是,大多数工作都jobsList没有通过测试JobType,只有少数工作会因测试Running而失败,只有一个工作将无法通过测试Id.如果匹配失败,则无法评估其他匹配,并且由于序列点不会发生这种情况.

我的三个部分问题是:这是真的,是否可证明是真的,我可以给我的同事一个更好的解释,为什么重新排序是一个好主意?

Eri*_*ert 7

我的理由是,jobList中的大多数作业都无法通过JobType测试,只有少数会因运行测试失败而只有一个会失败测试Id.如果匹配失败,则无法评估其他匹配,并且由于序列点不会发生这种情况.这是真的?

如果第一个谓词是假的,那么第二个和第三个谓词是否会被评估?是.你的推理是正确的.

当第一个是假的时候避免评估第二个和第三个谓词是否真的是一个明显的表现胜利? 不一定,有两个原因.

首先,并非所有比较都同样昂贵.比较字符串"PurgeData"和"PurgeDatz"需要在挽救之前比较八个字符; 比较整数更便宜.在平均情况下,避免字符串比较可能更便宜,即使它更可能是错误的.

其次,请记住,避免运行代码会消除代码的成本,但您必须编写代码才能测试是否应该避免使用其他代码.测试很便宜但不是免费的!在某些情况下,避免代码实际上比简单地运行代码更昂贵.

请参阅我最近关于此主题的文章:

http://ericlippert.com/2015/11/02/when-would-you-use-on-a-bool/

我可以给我的同事一个更好的解释,为什么重新排序是一个好主意?

是.您可以设置性能指标和实际,重要的以客户为中心的性能目标,您可以凭经验证明代码在根据指标进行衡量时无法满足您的目标,并且您可以凭经验证明代码符合您的目标你用另一种方式写它.

如果你不这样做那么你所描述的是你无法衡量的差异,没有人关心; 你的同事告诉你不要浪费时间改变工作代码以便有所作为,你无法衡量没有人关心的事情.