文字列を何百万回も DateTime に解析します。
public static CultureInfo ci = CultureInfo.InvariantCulture;
while (!reader.EndOfStream)
{
line = reader.ReadLine();
string[] fields = line.Split(' ');
DateTime newDT = DateTime.ParseExact(fields[0], "yyyyMMddTHHmmssfff", ci);
}
私のプロファイラーは、ParseExact が時間の大きな部分を占めていることを強調しています。文字列をより高速な DateTime に解析できる他の方法/アプローチはありますか?
フォローアップ1:
1)これを試しましたが、速度は同じでした
bool OK = DateTime.TryParseExact(fields[0], "yyyyMMddTHHmmssfff", null, System.Globalization.DateTimeStyles.None,out DT);
2)
私は自分のパーサーをコーディングしようとしましたが、これも遅かったです:
public static DateTime fastParse(ref string s)
{
return new DateTime(int.Parse(s.Substring(0,4)), int.Parse(s.Substring(4,2)),int.Parse(s.Substring(6,2)), int.Parse(s.Substring(9,2)),int.Parse(s.Substring(11,2)),int.Parse(s.Substring(13,2)),int.Parse(s.Substring(15, 3)));
}
フォローアップ2
値を保存するというMaster117の提案を試しました-再び高速ではありません-おそらく問題は構造ですか?
public class fastParseData
{
int year;
int mon;
int day;
int hour;
int min;
string previousSlice = "";
public DateTime fastParse(ref string s)
{
if (previousSlice != s.Substring(0, 12))
{
year=int.Parse(s.Substring(0,4));
mon=int.Parse(s.Substring(4,2));
day=int.Parse(s.Substring(6,2));
hour= int.Parse(s.Substring(9,2));
min = int.Parse(s.Substring(11,2));
previousSlice = s.Substring(0, 12);
}
return new DateTime(year, mon, day, hour,min, int.Parse(s.Substring(13, 2)), int.Parse(s.Substring(15, 3)));
}
}
フォローアップ3
public class fastParseData
{
int year;
int mon;
int day;
int hour;
int min;
string previousSlice = "";
DateTime previousDT;
public DateTime fastParse(ref string s)
{
if (previousSlice != s.Substring(0, 12))
{
year=int.Parse(s.Substring(0,4));
mon=int.Parse(s.Substring(4,2));
day=int.Parse(s.Substring(6,2));
hour= int.Parse(s.Substring(9,2));
min = int.Parse(s.Substring(11,2));
previousSlice = s.Substring(0, 12);
previousDT = new DateTime(year, mon, day, hour,min,0,0);
}
return previousDT.AddMilliseconds((int.Parse(s.Substring(13, 2))*1000)+int.Parse(s.Substring(15, 3)));
}
}
フォローアップ4
私のプロファイラーから、核心は
int.Parse(s.Substring(13, 2))
解析ビットは部分文字列よりもコストがかかります。
私は試した
int.TryParse(s.Substring(13, 2),NumberStyles.None,ci, out secs)
Convert.ToInt32(s.Substring(13, 2));
繰り返しますが、速度に違いはありません。
int を解析するより高速な方法はありますか?