「HHmmss」形式の文字列をDateTimeまたは整数に高速に変換する必要があります。私はそのようなコードをテストしました:
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);
出力は
172400のデコード 開始時間121 終了時間244 172400のデコード 開始時間236 終了時間383 172400のデコード 開始時間116 終了時間416 172400のデコード 開始時間235 終了時間421 デコード172359 開始時間149 終了時間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*/)
あなたは何を提案できますか、そして何が最速の方法でしょうか?なぜ私がパフォーマンスに関心があるのかを尋ねないでください。代わりに、それをより速く行う方法を提案してください。
結果:
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ティック
測定にループを使用する場合、実際には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));