我需要將格式爲「HHmmss」的字符串快速轉換爲DateTime或整數。我測試這樣的代碼:將字符串「172406」轉換爲整數17,24,06快速
Console.WriteLine("decoding " + text);
long microseconds = sw.ElapsedTicks/(Stopwatch.Frequency/(1000L * 1000L));
Console.WriteLine("start time " + microseconds);
field = DateTime.ParseExact(text, "HHmmss", null);
microseconds = sw.ElapsedTicks/(Stopwatch.Frequency/(1000L * 1000L));
Console.WriteLine("finish time " + microseconds);
並且輸出是
decoding 172400 start time 121 finish time 244 decoding 172400 start time 236 finish time 383 decoding 172400 start time 116 finish time 416 decoding 172400 start time 235 finish time 421 decoding 172359 start time 149 finish time 323
所以在平均約150微秒。有很多時候,我正在寫HFT軟件,最好的HFT平均有10微秒的「嘀嗒交易」時間(這包括所有事情!)。我明白,使用C#這是不可能的,但我仍然認爲,即使使用C#,150微秒也是太多了。
現在我想用另一種算法,但我不知道如何從文本「提取」的整數:
field = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, /*extract hour, min, sec from text*/)
你能提出什麼會是最快的方法是什麼? 請不要問我爲什麼關心perfomance,而只是建議如何更快地做到這一點。
結果:
使用DateTime.ParseExact(text, "HHmmss", null)
約6-8蜱
使用TimeSpan ts = TimeSpan.ParseExact(text, "hhmmss", null);
約3-4蜱
使用int hour = 10 * text[0] + text[1] - 11 * '0';
...約0蜱
NOTE:事實上遠遠低於如果使用循環進行測量,則爲0。事實上,它發現最後的版本比其他版本快100倍。
代碼:
long startMicroseconds = sw.ElapsedTicks /*/ (Stopwatch.Frequency/(1000L * 1000L))*/;
//TimeSpan ts = TimeSpan.ParseExact(text, "hhmmss", null);
//int hour = 10 * text[0] + text[1] - 11 * '0';
//int minute = 10 * text[2] + text[3] - 11 * '0';
//int second = 10 * text[4] + text[5] - 11 * '0';
field = DateTime.ParseExact(text, "HHmmss", null);
long finishMicroseconds = sw.ElapsedTicks /*/ (Stopwatch.Frequency/(1000L * 1000L))*/;
Console.WriteLine("elappsed " + (finishMicroseconds - startMicroseconds));
這是一個不好的方法來計時。在循環中運行代碼並計算整個循環。然後獲得每次迭代的平均時間。 –
@MarkByers,結果將是150 + - 50. – javapowered
@javapowered:你測試過了,還是假設? – Mr47