Sprawdziłem kod współpracowników i powiedziałem mu, aby ponownie uporządkował porównania boolowskie w następującym predykacie Linq Any
ze względu na wydajność. Tak więc biorąc pod uwagęZamówienie ewaluacji C#
public class JobResult
{
public JobResult();
public string Id{ get; set; }
public StatusEnum Status{ get; set; }
public string JobType{ get; set; }
}
i
IList<JobResult> jobsList = _jobRepository.FetchJobs()
Zaproponowałem zmianę następujących czynności:
//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;
stać
//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;
Moje rozumowanie było, że większość miejsc pracy w jobsList
zawieść th e test dla JobType
, tylko kilka zakończy się niepowodzeniem testu dla Running
i tylko jeden zakończy się niepowodzeniem testu dla Id
. Jeśli dopasowanie nie powiedzie się, nie ma punktu, który oceniałby pozostałe, a z powodu punktów sekwencyjnych nie wystąpi.
Moje trzy częściowe pytanie brzmi: czy to prawda, czy to jest do udowodnienia prawda i czy istnieje lepsze wyjaśnienie, które mogę przekazać mojemu koledze, dlaczego zamawianie jest dobrym pomysłem?
Należy pamiętać, że porównanie "int" lub "wyliczanie" obejmuje jedną instrukcję maszyny, podczas gdy porównywanie ciągów jest znacznie bardziej skomplikowane. –
Możesz to udowodnić, przenosząc każdą klauzulę do funkcji i wewnątrz tej funkcji do logu lub 'Console.WriteLine' dla examlpe. – DavidG
Położyłabym porównanie łańcuchów na końcu. Myślenie o tym trudniej byłoby stratą czasu. Porównanie dwóch intów raz lub dwa razy nie będzie wąskim gardłem. – SimpleVar