【发布时间】:2010-07-28 16:32:55
【问题描述】:
我有一个算法,它扫描从 .csv 文件(大约 3700 行)读取的数据,并通过为该年的每个星期日运行 count++ 并将计数值指定为来评估每个条目在一年中的哪个交易周日期在该周内的交易周。
它工作正常,但性能滞后。这是使用 Task.Factory.StartNew 运行的第三个函数(我也尝试过 parallel.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();
【问题讨论】: