gpt4 book ai didi

c# - 求值顺序 c#

转载 作者:太空狗 更新时间:2023-10-29 20:56:22 25 4
gpt4 key购买 nike

出于性能原因,我查看了一位同事的代码并告诉他重新排序以下 Linq Any 谓词中的 bool 比较。如此给定

public class JobResult
{
public JobResult();

public string Id{ get; set; }
public StatusEnum Status{ get; set; }
public string JobType{ get; set; }
}

IList<JobResult> jobsList = _jobRepository.FetchJobs()

我建议更改以下内容:

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

成为

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

我的理由是,jobsList 中的大部分作业都未能通过 JobType 测试,只有少数作业无法通过 Running 测试,并且只有一个将无法通过 Id 的测试。如果匹配失败,则没有必要评估其他匹配,并且由于序列点,这不会发生。

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

最佳答案

My reasoning was that most of the jobs in jobsList fail the test for JobType, only a few will fail the test for Running and only one will fail the test for Id. If a match fails there is no point evaluating the others and because of sequence points this will not occur. Is this true?

当第一个谓词为假时,第二个和第三个谓词不会被评估,这是真的吗?是的。你的推理在那里是正确的。

当第一个谓词为假时避免对第二个和第三个谓词求值是一个明显的性能胜利,这对吗? 不一定,原因有二。

首先,并非所有的比较都同样昂贵。比较字符串“PurgeData”和“PurgeDatz”需要比较八个字符才能退出;比较整数更便宜。在一般情况下,避免字符串比较可能更便宜,即使它更有可能是假的。

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

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

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

is there a better explanation I can give to my colleague for why reordering is a good idea?

是的。您可以设置一个性能指标和一个现实的、重要的以客户为中心的性能目标,您可以凭经验证明代码在根据该指标衡量时无法满足您的目标,并且您可以凭经验证明代码在以下情况下满足您的目标你用另一种方式写。

如果您不这样做,那么您所描述的就是一种您无法衡量并且没有人关心的差异;如果您的同事告诉您不要再浪费时间更改工作代码以产生您无法衡量但没人关心的变化,您的同事会说得很对。

关于c# - 求值顺序 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33803533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com