我有一個算法,可以掃描從.csv文件(約3700行)中讀取的數據,並通過爲每個星期日運行一次count ++來評估每個條目所在年度的哪一個交易周並在該日期落在該周內時將計數值指定爲交易周。「一週的一週」算法需要改進
它正在工作,但表現滯後。這是使用Task.Factory.StartNew運行的第三個函數(我也嘗試了parallel.Invoke)。
時間測試的結果。
前:00:00:05.58
後:00:00:23.27
UPDATE
新增突破每一個交易周設置後。時間改善但仍然緩慢。
新的時間:00:00:15.74
對於我們來說今年的第一週爲1周(不爲0),並定義爲從當年的第一天,直到星期天。如果一年的第一天是星期天,那麼第一週的時間是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());
}
}
請幫忙。
UPDATE
NEW TIME
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();
Jesper我不確定這是否會由於CalendarWeekRule而產生正確的結果。請參閱我的更新。 – Chris 2010-07-28 18:02:58
@Chris:如果使用CalendarWeekRule.FirstDay會怎麼樣? – 2010-07-28 18:35:12
謝謝Jesper,檢查了過去幾年的第一天,值都是正確的! – Chris 2010-07-28 19:40:03