Этот метод подсчета довольно медленный в одном модульном тесте. Можно ли улучшить, возможно, путем параллелизации?Как ускорить этот алгоритм?
Редактировать: Чтобы быть ясным, я не могу изменить интерфейс календаря или реализации. Меня интересует алгоритм подсчета.
public static int CountBusinessDays(ICalendar calendar, DateTime start, DateTime end)
{
int nBusinessDays = 0;
for (DateTime current = start; current <= end; current = current.AddDays(1))
{
if (calendar.IsBusinessDay(current))
++nBusinessDays;
}
return nBusinessDays;
}
public interface ICalendar
{
bool IsBusinessDay(DateTime day);
}
У вас есть доступ к реализации 'ICalendar'? Или вы можете изменить интерфейс так, чтобы у вас был метод, который дает вам количество рабочих дней? Я думаю, было бы проще реализовать это в контексте «ICalendar», так как у вас должно быть достаточно информации, чтобы просто вычислить это без итерации. – ppetrov
Это невозможно для нас ответить. Вы попробовали? Начните с выяснения, почему это так медленно. Может ли 'IsBusinessDay' вызывать базу данных? И парализовать операцию и измерить, если это поможет. – Steven
Какова реализация IsBusinessDay примерно? Если он делает вызов веб-службы для каждого дня, то самые большие улучшения скорости будут достигнуты за счет загрузки списка рабочих дней навалом. – dtb