У меня есть алгоритм, который просматривает данные, считанные из файла .csv (около 3700 строк), и оценивает, в какую торговую неделю года входит каждая запись, выполняя count ++ для каждого воскресенья этого года и назначая значение count какторговая неделя, когда дата попадает в эту неделю.
Работает, но производительность отстает.Это третья функция, запущенная с использованием Task.Factory.StartNew (я также пробовал параллельный. Invoke).
Результаты временных тестов.
до: 00: 00: 05.58
после: 00: 00: 23.27
ОБНОВЛЕНИЕ
Добавлен перерыв после установки каждой торговой недели.Время улучшилось, но все еще медленно.
новое время: 00: 00: 15,74
Для наших целей первая неделя года - это неделя 1 (не 0), и она определяется с первого днягода до воскресенья.Если первый день года - воскресенье, продолжительность недели 1 составляет 1 день.
private void SetDefiniteWeeks()
{
string FileLoc = FilePath + Market + ".csv";
string[] Data = File.ReadAllLines(FileLoc);
var FileData = from D in Data
let DataSplit = D.Split(',')
select new
{
Date = DateTime.Parse(DataSplit[0]),
ClosingPrice = double.Parse(DataSplit[4])
};
//assign each date to it's relevant week
TradingWeek TW;
List<TradingWeek> tradingWeek = new List<TradingWeek>();
foreach (var pe in FileData)
{
// DateTime dt = pe.Date;
int Year = pe.Date.Year;
string End_of_Week = "Sunday";
int WeekCount = 0;
DateTime LoopDate_Begin = new DateTime(Year,1,1);
DateTime LoopDate_End = new DateTime(Year,12,31);
do
{
if (LoopDate_Begin.DayOfWeek.ToString() == End_of_Week)
{
WeekCount++;
if (LoopDate_Begin.DayOfYear > pe.Date.DayOfYear && LoopDate_Begin.DayOfYear < (pe.Date.DayOfYear + 7))
{
TW = new TradingWeek { Week = WeekCount, Date = pe.Date };
tradingWeek.Add(TW);
break;
}
}
LoopDate_Begin = LoopDate_Begin.AddDays(1);
} while (LoopDate_Begin.Date.ToString() != LoopDate_End.Date.ToString());
}
}
Пожалуйста, помогите.
ОБНОВЛЕНИЕ
НОВОЕ ВРЕМЯ
00: 00: 06.686
Огромное улучшение.Спасибо всем за помощь.
Исправленный код:
CalendarWeekRule cw = CalendarWeekRule.FirstDay;
var calendar = CultureInfo.CurrentCulture.Calendar;
var trad_Week = (from pe in FileData
select new TradingWeek
{
Date = pe.Date,
Week = (calendar.GetWeekOfYear(pe.Date, cw,DayOfWeek.Sunday))
}).ToList();