Ho esaminato un codice di colleghi e gli ho detto di riordinare i confronti booleani nel seguente predicato Linq Any
per motivi di prestazioni. Quindi, datoOrdine di valutazione C#
public class JobResult
{
public JobResult();
public string Id{ get; set; }
public StatusEnum Status{ get; set; }
public string JobType{ get; set; }
}
e
IList<JobResult> jobsList = _jobRepository.FetchJobs()
ho suggerito modificando la seguente:
//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;
per diventare
//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;
Il mio ragionamento era che la maggior parte dei posti di lavoro in jobsList
falliscono esimo e test per JobType
, solo alcuni non supereranno il test per Running
e solo uno fallirà il test per Id
. Se una partita fallisce, non vi è alcun punto che valuti gli altri e, a causa dei punti di sequenza, ciò non si verificherà.
La mia domanda in tre parti è: è vero, è verosimilmente vero e c'è una spiegazione migliore che posso dare al mio collega perché il riordino è una buona idea?
Tenere presente che un confronto 'int' o' enum' implica una singola istruzione macchina, mentre un confronto tra stringhe è molto più complicato. –
Puoi provarlo spostando ogni clausola su una funzione e all'interno di quella funzione viene visualizzato un log o 'Console.WriteLine' per examlpe. – DavidG
Ho messo il confronto delle stringhe per ultimo. Pensare a qualcosa di più difficile sarebbe una perdita di tempo. Il confronto tra 2 ints una o due volte non sarà il collo di bottiglia. – SimpleVar