Я рассмотрел код коллег и сказал ему переупорядочить логические сравнения в следующем предикате Linq Any
по соображениям производительности. Поэтому, учитываяПорядок оценки C#
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
. Если совпадение не выполняется, нет смысла оценивать остальные, и из-за точек последовательности это не произойдет.
Мой вопрос состоит из трех частей: это правда, верно ли это, и есть ли лучшее объяснение, которое я могу дать моему коллеге за то, почему переупорядочение - хорошая идея?
Имейте в виду, что сравнение 'int' или' enum' включает в себя единую машинную инструкцию, тогда как сравнение строк намного сложнее. –
Вы можете доказать это, переведя каждое предложение в функцию и внутри этой функции вывести на журнал или 'Console.WriteLine' для примера. – DavidG
Я бы поставил сравнение строк последним. Думать о чем-то труднее об этом было бы пустой тратой времени. Сравнение между двумя целями один или два раза не будет вашим узким местом. – SimpleVar