2015-11-25 3 views
0

У меня есть таможня Dictionary<T>, у которой есть резервная коллекция KeyedCollection. При попытке оптимизировать проблемы производительности, которые я вижу во время работы в профилировщике, я заметил, что IndexOf(T key) является одной из моих проблемных областей. Код в настоящее время осуществляется в следующем виде:Big O Время выполнения исключений

public int IndexOf(TKey key) 
{ 
    if (keyedCollection.Contains(key)) 
    { 
     return keyedCollection.IndexOf(keyedCollection[key]); 
    } 
    else 
    { 
     return -1; 
    } 
} 

Я знаю, что оба Contains(T key) и IndexOf(T key) имеют время автономной работы большой-O из O (N) и подтвердили это на сайте MSDN. (https://msdn.microsoft.com/en-us/library/ms132438(v=vs.110).aspx)
Я думал, что хороший способ, чтобы оптимизировать этот код будет принимать одну из O (N) операций, поэтому я изменил код для этого:

public int IndexOf(TKey key) 
{ 
    try 
    { 
     return keyedCollection.IndexOf(keyedCollection[key]); 
    } 
    catch (KeyNotFoundException) 
    { 
     return -1; 
    } 
} 

Когда я сравнил время автономной между 2 около 500 000 операций, код с Contains(T key) out выполнил сценарий try-catch почти в 2 раза.

Мой вопрос в том, есть ли огромное количество накладных расходов при использовании блока try-catch, который бы сильно снизить производительность?

+0

Почему вы не используете .NET-словарь? Если вы используете свой собственный, используя линейный поиск, он будет * * слишком медленным. Не делай этого. – Servy

+0

индекс на словаре не имеет смысла. вы имеете в виду его «Список '? также словарь типа «Словарь ' –

+0

Это OrderedDictionary, я знаю, что есть хиты производительности в этом, но я стараюсь как можно больше оптимизировать его. – Middas

ответ

3

Выбрасывание исключения здесь будет O (1), так как стоимость броска и исключения исключений никоим образом не зависит от размера коллекции; это будет фиксированная стоимость. Эта фиксированная стоимость может быть высокой, но она не будет расти.

+0

На основании этого ответа, какова лучшая реализация? Фиксированный O (1) реализации try-catch, зная, что, хотя размер определен в определенной степени, он будет медленнее, но время выполнения никогда не увеличится? – Middas

+0

@Middas Лучшая реализация заключается в том, чтобы исправить основной алгоритм до того, который имеет лучшее время исполнения, а именно хэш-поиск или структуру на основе дерева, вместо того, чтобы выполнять линейные поиски. – Servy

+0

Спасибо за ваш вклад, я посмотрю на это. – Middas

Смежные вопросы