Спокойной ночи,HashSet & Список для хранения строк
Я пытался эталон производительности HashSet и список типов данных в C#, чтобы проверить какой из них лучше, когда много вставок/удаление должно быть сделано. Код, который я использую, примерно следующий.
public static Func<String, HashSet<String>> ListaPossiveisCorreccoes = StrPalavra => {
(...)
HashSet<String> ListaCorreccoes = new HashSet<String>();
(...)
(Lots of .Add operations)
return ListaCorreccoes;
};
public static Func<String, IEnumerable<String>> ListaCorreccoes = (StrPalavra) =>
{
HashSet<String> ConjuntoCorreccoes = new HashSet<String> ();
foreach (String StrTmp in ListaPossiveisCorreccoes(StrPalavra))
foreach (String StrTmp2 in ListaPossiveisCorreccoes(StrTmp))
ConjuntoCorreccoes.Add(StrTmp2);
return ConjuntoCorreccoes/*.Distinct()*/.Where(PalavraConhecida)*/;
};
Когда я бег sequentaly две функции, описанной выше, она занимает около 250-285ms завершить (я использую запоминание). Однако, если я заменяю HashSet<String>
на List<String>
всюду и раскомментирую прокомментированную часть последней строки (таким образом, выбирая дубликаты из списка), для завершения требуется всего 140-145 мс. Это противоречит тому, что я читал о HashSets, в котором говорится, что их производительность намного лучше, чем в списках операций добавления/удаления. Может кто-нибудь, пожалуйста, скажите мне, нормально ли это? 250 мс, конечно, не много, но это почти в два раза больше времени, чем в списках, и это важно, поскольку эти функции призваны вызываться повторно.
спасибо.
Здесь я взял эту идею из ... http://www.codethinked.com/post/2010/02/22/An-Overview-Of-System_Collections_Generic.aspx – Miguel
Вы правы, это, вероятно, будет медленнее, чем список, но, говоря в терминах нотации заказа, операции добавления списка и HashSet в большинстве случаев эквивалентны [O (1)]. MSDN говорит (как для List, так и для HashSet): Если граф уже равен емкости объекта HashSet, емкость автоматически настраивается для размещения нового элемента. Если граф меньше емкости внутреннего массива, этот метод является операцией O (1). Если объект HashSet должен быть изменен, этот метод становится операцией O (n), где n является Count. http://msdn.microsoft.com/en-us/library/bb353005.aspx –