私の現在のプロジェクトでは、文字列を解析し、その一部をコンソールに書き込む必要があります。あまりオーバーヘッドをかけずにこれを行う方法をテストしているときに、テストしていた1つの方法が、実際にはConsole.WriteLineよりも高速であることがわかりました。これは少し混乱します。
これはベンチマークを行うための適切な方法ではないことは承知していますが、通常は「これはこれよりも高速です」という大まかな方法で問題ありません。これは、数回実行した後でわかります。
static void Main(string[] args)
{
var timer = new Stopwatch();
timer.Restart();
Test1("just a little test string.");
timer.Stop();
Console.WriteLine(timer.Elapsed);
timer.Restart();
Test2("just a little test string.");
timer.Stop();
Console.WriteLine(timer.Elapsed);
timer.Restart();
Test3("just a little test string.");
timer.Stop();
Console.WriteLine(timer.Elapsed);
}
static void Test1(string str)
{
Console.WriteLine(str);
}
static void Test2(string str)
{
foreach (var c in str)
Console.Write(c);
Console.Write('\n');
}
static void Test3(string str)
{
using (var stream = new StreamWriter(Console.OpenStandardOutput()))
{
foreach (var c in str)
stream.Write(c);
stream.Write('\n');
}
}
ご覧のとおり、Test1はConsole.WriteLineを使用しています。私が最初に考えたのは、文字ごとにWriteを呼び出すことでした。Test2を参照してください。しかし、これにより、約2倍の時間がかかりました。私の推測では、書き込みのたびにフラッシュするため、処理が遅くなります。そこで、StreamWriter(AutoFlush off)を使用してTest3を試しましたが、その結果、Test1よりも約25%速くなりました。なぜそうなのか、本当に興味があります。それとも、コンソールへの書き込みを適切にベンチマークできないということですか?(テストケースを追加すると、奇妙なデータに気づきました...)
誰かが私を啓発できますか?
また、これを行うためのより良い方法がある場合(文字列を調べて、その一部のみをコンソールに書き込む)、コメントしてください。