1

如果我比較兩種已知的值類型,我會從c#中的|||運算符獲得更好的性能嗎?。用於比較值類型的短路運算符的網絡性能?

我的特定使用情況下是一個bool構件在類指示陳舊數據,通過環的方法被激活這樣的:

private bool _stale; 
private HashSet<Foo> _foos; 

然後另一種方法,循環並可能激活該標誌

foreach (var foo in foos) 
{ 
    _stale = _foos.Add(foo) | _stale; 

    //Or is the following line better? 
    //_stale = _foos.Add(foo) || _stale; 
} 

我想我問的是,短路運營商的開銷是否足夠,我不會用它來檢查已分配的值類型...

+0

兩種方式編寫代碼。測量性能。你還能知道哪兩件事情更快? –

+0

@EricLippert你可能是少數幾個可能知道*沒有*建立測試的人之一... – Matthew

+0

我向你保證這不是真的;如果我從性能分析中學到了一件事,那就是猜測兩件事中哪一件更快是毫無意義的。 –

回答

4

我會使用Or Assignment operator

_stale |= added; 

或者:

_stale |= _foos.Add(foo); 

該運營商是專門爲這個目的,這使得意圖明確的設計(和最有可能是最好的在性能方面,因爲它是專門爲此目的而設計的)。

至於實際的性能,這個級別的微優化通常幾乎不可能測量,因爲任何性能差異將遠遠小於您的操作差異(HashSet<T>.Add調用),代碼的清晰度是更重要的是。你可以建立一個測試來衡量這一點,但是就性能而言,它的可靠性是不可能的。

+0

msdn對我來說並不清楚。是否確保'.Add()'被執行? – Matthew

+1

@Mthethew每次都會執行。 –

+0

我知道這是一個微型優化......但我可以在不犧牲清晰度的前提下「做到最佳」,沒有太多努力,那爲什麼不呢? – Matthew