Я провел несколько тестов производительности, используя собственный BinarySearch
метод List<T>
.Логика поиска ближайшего DateTime
показана ниже:
public static DateTime GetNearest(List<DateTime> source, DateTime date)
{
var index = source.BinarySearch(date);
if (index >= 0) return source[index];
index = ~index;
if (index == 0) return source[0];
if (index == source.Count) return source[source.Count - 1];
var d1 = source[index - 1];
var d2 = source[index];
return (date - d1 < d2 - date) ? d1 : d2;
}
Я создал случайный список из 1 000 000 отсортированных дат, охватывающий промежуток времени от 10 до мин.Затем я создал список одинакового размера с несортированными случайными датами для поиска, охватывающий немного больший промежуток времени.Затем изменил сборку на Release и начал тестирование.Результат показал, что можно выполнить более 800 000 поисков менее чем за секунду, используя только одно ядро относительно медленной машины.
Затем я увеличил сложность теста, выполнив поиск в List<(DateTime, object)>
содержащий 1 000 000 элементов, поэтому для каждого сравнения требуется два дополнительных вызова функции dateSelector
, которая возвращает свойство DateTime
каждого ValueTuple
.Результат: 350 000 запросов на поток в секунду.
Я еще больше усложнил задачу, используя ссылочные типы в качестве элементов, заполнив List<Tuple<DateTime, object>>
1 000 000 кортежей.Производительность все еще была довольно приличной: 270 000 запросов на поток в секунду.
Мой вывод заключается в том, что метод BinarySearch
молниеносен, и было бы удивительно, если бы он оказался узким местом приложения.