簡體   English   中英

評估順序c#

[英]Order of evaluation c#

我查看了同事代碼並告訴他出於性能原因重新排序以下Linq Any謂詞中的布爾比較。 所以給定

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 如果匹配失敗,則無法評估其他匹配,並且由於序列點不會發生這種情況。

我的三個部分問題是:這是真的,是否可證明是真的,我可以給我的同事一個更好的解釋,為什么重新排序是一個好主意?

我的理由是,jobList中的大多數作業都無法通過JobType測試,只有少數會因運行測試失敗而只有一個會失敗測試Id。 如果匹配失敗,則無法評估其他匹配,並且由於序列點不會發生這種情況。 這是真的?

如果第一個謂詞是假的,那么第二個和第三個謂詞是否會被評估? 是。 你的推理是正確的。

當第一個是假的時候避免評估第二個和第三個謂詞是否真的是一個明顯的表現勝利? 不一定 ,有兩個原因。

首先,並非所有比較都同樣昂貴。 比較字符串“PurgeData”和“PurgeDatz”需要在挽救之前比較八個字符; 比較整數更便宜。 在平均情況下,避免字符串比較可能更便宜,即使它更可能是錯誤的。

其次,請記住,避免運行代碼會消除代碼的成本,但您必須編寫代碼才能測試是否應該避免使用其他代碼 測試很便宜但不是免費的! 在某些情況下,避免代碼實際上比簡單地運行代碼更昂貴。

請參閱我最近關於此主題的文章:

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

我可以給我的同事一個更好的解釋,為什么重新排序是一個好主意?

是。 您可以設置性能指標和實際,重要的以客戶為中心的性能目標,您可以憑經驗證明代碼在根據指標進行衡量時無法滿足您的目標,並且您可以憑經驗證明代碼符合您的目標你用另一種方式寫它。

如果你不這樣做那么你所描述的是你無法衡量的差異,沒有人關心; 你的同事告訴你不要浪費時間改變工作代碼以便有所作為,你無法衡量沒有人關心的事情。

我的理由是,jobList中的大多數作業都無法通過JobType測試,只有少數會因運行測試失敗而只有一個會失敗測試Id。 如果匹配失敗,則無法評估其他匹配,並且由於序列點不會發生這種情況。

是的, || &&運算符在C#中短路 意思是,如果條件已經滿足,他們將不會繼續評估其他表達式。 假定JobType計算結果為false ,則不會計算其他謂詞。 請注意,您的代碼可能具有額外的開銷,這超過了這些謂詞的重新排序,例如intstring (后者最有可能更昂貴)。

這確實屬於微優化的范疇,除了向您的同事解釋什么是短路之外,我建議您實際測試此代碼以確定它是否提供任何性能優勢。

就個人而言,我不會太介意這一點。 使用LINQ的開銷遠遠超過比較本身。 如果第一個謂詞評估為false,則忽略所有其他謂詞,因此首先測試最不可能的是一個好主意。

繼續評估的昂貴,枚舉是整數,因此比較枚舉比評估整個字符串便宜。 第二個評估也是一個整數,所以比比較一個字符串少。 我認為string首先比較長度,所以這也是一個整數比較,比較每個字符的成本更高。 因此,如果字符串與其比較的位置相同,則字符串的評估比整數更重。 否則它沒關系太多。

很容易浪費時間來優化不慢的東西。

如果你不得不問哪種方法更快,你就無法區分(即兩者都足夠快)。

Linq查詢有時會轉換為SQL,因此速度可能取決於數據庫的內部實現,這是您無法控制的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM