2008-12-10 69 views
1

經常提到異常是很昂貴的,.NET中的各種方法也很昂貴。什麼構成昂貴的方法或資源?

在.NET中究竟構成了一個昂貴的方法?

該方法需要花費時間嗎?例如。我使用WebClient對象(這不是異步)獲得網頁的響應流,並且在獲取響應並將其分配給變量時,需要花費一段時間來逐步完成這一行代碼。也許是因爲網頁本身是圖形密集型和大型的。爲了查看所花費的時間,我知道我可以使用秒錶或計時器(兩者之間存在細微的差別,我不記得了)。

或者它是否採取了資源?如果是這樣,看到一種方法所需資源的最佳方式是什麼?我知道我可以使用GC方法之一或探查器。還有哪些其他方法?

+0

備註:.NET Exceptions的成本通常會增加幾個數量級。除非你每秒都在投擲數千個,否則不需要擔心。 – Bevan 2008-12-10 01:51:34

回答

0

答案是你有兩種昂貴的操作。

我個人使用由RedGate提供的ANTs Profiler來監控應用程序事件的時間和內存方面以及成本。

9

昂貴是一個程度和背景的問題。

我在圖像處理方面工作,我認爲部門昂貴。就我而言,任何結束在一個循環中執行兩次到五百萬次的操作都會加起來。這可能是1/8秒和1/32秒之間的差異。 UI時間的1/8秒對於動態顯示很重要。 1/32是可以接受的。

在其他情況下,它可以完全解碼大型JPEG圖像並縮小它們,而不是利用同樣文件中編碼的2個縮小版本的功率。

在網頁時間,它可能是頁面加載時的服務器點擊次數。明白了嗎?

上下文就是一切。

資源被認爲是昂貴的,如果它們稀缺並導致其他事情等待。如果你有一個非raid磁盤,如果兩個進程在各處都彈起來,你將付出沉重的訪問代價,因此很大程度上依賴於驅動器和操作系統上的緩存。

您的打印機是一個非常昂貴的資源,特別是如果它沒有紙張,因此排隊。

與其他語言功能相比,例外情況非常昂貴。靜態方法調用很便宜。普通方法調用稍微昂貴一些。虛擬方法調用稍微昂貴一些。例外情況成本更高。例如,你可以抱怨C#沒有強類型的多態返回類型,我可以說 - 哦,不,它 - 只是拋出你的結果,並在另一邊捕獲正確的類型。然後,我會因爲提出建議而被笑出房間。與返回(這是少數幾條指令)相比,根據具體情況,異常可能會導致數十到數百次。

+0

「取決於」的+1 :-) – 2009-11-02 20:30:27

1

是的,當人們談論功能昂貴時,它們通常意味着執行時間。(您支付調用它的價格是你的線程被阻塞X微秒,直到函數調用完成,畢竟)

當然,它也可能是昂貴的資源使用的條件,但通常情況下,它的執行時間人們提到的。

0

我同意plint,但我想補充說,昂貴通常意味着需要更多的時間或資源比預期的要多,或者比給定情況需要更多的資源。一般來說,如果有一種替代方法使用的CPU或資源更少,則更爲合適。

例如,由於構建堆棧跟蹤所需的時鐘週期量,異常會被視爲很貴。因此,將異常用作流量控制機制是一個非常糟糕的主意。因此,如果您正在解析自定義數據格式並且格式不正確,則可能會更好地返回具有失敗狀態和字符串的對象(格式錯誤的數據行6,位置3),而不是拋出MalformedDataException。

但是,昂貴是一個程度和角度的問題。對於CPU設計師來說,高速緩存未命中是災難性的。爲了滿足,分工很昂貴。對我而言,硬盤訪問非常昂貴。