У нас недостаточно информации, чтобы дать очень предписывающий совет, но есть некоторые общие вещи, о которых вы должны подумать.
Какие типы значений времени? Вы сравниваете время даты или какое-то примитивное значение (например, time_t). Подумайте, как ваши типы данных влияют на производительность. Выберите лучшие.
Должны ли вы действительно делать это в памяти или вы должны поместить все эти строки в SQL и разрешить запрашивать их там? Это действительно хорошо.
Но давайте придерживаться того, о чем вы спрашивали - при поиске в памяти.
Когда поиск занимает слишком много времени, есть только одно решение - искать меньше вещей. Вы делаете это, разбивая свои данные таким образом, чтобы вы могли легко исключить как можно больше узлов, используя как можно меньше операций.
В вашем случае у вас есть два критерия - код и диапазон дат. Вот несколько идей ...
Вы можете разделить на основе кода - т. Е. Словаря> - если у вас много равномерно распределенных кодов, каждый из ваших размеров списка будет иметь размер N / M (где N = общее количество событий, а M = количество событий). Таким образом, миллион узлов с десятью кодами теперь требует поиска 100 тыс. Элементов, а не миллиона. Но вы могли бы пойти немного дальше. Сам список можно отсортировать по времени запуска, что позволяет бинарному поиску очень быстро исключить многие другие узлы. (это, конечно, имеет компромисс во времени для сбора данных). Это должно обеспечить очень быстро
Вы можете разделить на основе даты и просто сохранить все данные в одном списке, отсортированном по дате начала, и использовать двоичный поиск, чтобы найти дату начала, а затем продвинуться вперед, чтобы найти код. Есть ли преимущество этого подхода перед словарем? Это зависит от остальной части вашей программы. Может быть, важно быть IList. Я не знаю. Вы должны это выяснить.
Вы можете перевернуть модель словаря, чтобы разделить данные по времени начала, округленному до некоторой границы (в зависимости от длины, степени детализации и частоты ваших событий). В основном это группирование данных в группы с одинаковым временем запуска. Например, все события, которые были начаты между 12:00 и 12:01, могут быть в одном ведре и т. Д. Если у вас очень небольшое количество событий и много очень частых (но не патологически) событий, это может дать вам очень хорошая производительность поиска.
Суть? Подумайте о ваших данных. Подумайте, как дорого стоит добавлять новые данные и как дорого стоит запрашивать данные. Подумайте, как ваши типы данных влияют на эти характеристики. Примите обоснованное решение на основе этих данных. Если вы сомневаетесь, пусть SQL сделает это за вас.