[英]Big O Runtime of Exceptions
我有一個自定義的Dictionary<T>
,它具有KeyedCollection
的后備集合。 在嘗試優化在探查器中運行時遇到的性能問題時,我注意到IndexOf(T key)
是我的問題領域之一。 該代碼當前實現如下:
public int IndexOf(TKey key)
{
if (keyedCollection.Contains(key))
{
return keyedCollection.IndexOf(keyedCollection[key]);
}
else
{
return -1;
}
}
我知道Contains(T key)
和IndexOf(T key)
都具有O(n)的big-O運行時,並且已經在MSDN站點上確認了這一點。 ( https://msdn.microsoft.com/zh-cn/library/ms132438(v=vs.110).aspx )
我認為優化此代碼的一種好方法是刪除O(n)操作之一,因此我將代碼更改為:
public int IndexOf(TKey key)
{
try
{
return keyedCollection.IndexOf(keyedCollection[key]);
}
catch (KeyNotFoundException)
{
return -1;
}
}
當我比較這兩個大約超過500,000個操作之間的運行時時,帶有Contains(T key)
的代碼執行了try-catch場景的比例接近2。
我的問題是,使用try-catch塊時是否會產生大量開銷,從而大大降低性能?
這里拋出一個異常將是O(1),因為拋出和捕獲該異常的代價絕不取決於集合的大小。 這將是固定成本。 該固定成本可能很高,但不會增長。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.