Намедни тестируя приложение на большом количестве данных наткнулся на кусок кода, смысл которого был прост и привычен: выбрать все элементы коллекции А, идентификаторы которых присутствуют в коллекции Б.
Код выглядел примерно так:
//items is a List<MyItem>
//itemIds is a List<long>
var resultItems = items.Where(x => itemIds.Contains(x.Id));
Можно было делать join, но он в итоге всё равно в нечно подобное выражается, поэтому разницы нет.
Время выполнения этой штуки – 6.7 секунды. Да, там полно элементов, что-то десятки тысяч, но всё же – почти 7 секунд – это неприемлемо долго.
Оптимизировалось всё это дело введением одной строчки кода:
var hashedIds = new HashSet<long>(itemIds); //и дальше вместо itemIds используем hashedIds
В общем-то оно и понятно, что хэш в подобных вещах быстрее.
Время выполнения вот этой строчки (создание хэш-таблицы) – порядка 100 милисекунд.
Время выполнения выборки – порядка 40 милисекунд.
Итого – 150 милисекунд вместо 6.7 секунд. Неплохо :)
P.S. Поковыряйтесь в профайлером – много интересного найдёте. Я нашёл :)