У меня есть таможня 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, который бы сильно снизить производительность?
Почему вы не используете .NET-словарь? Если вы используете свой собственный, используя линейный поиск, он будет * * слишком медленным. Не делай этого. – Servy
индекс на словаре не имеет смысла. вы имеете в виду его «Список'? также словарь типа «Словарь ' –
Это OrderedDictionary, я знаю, что есть хиты производительности в этом, но я стараюсь как можно больше оптимизировать его. – Middas