在我当前的项目中,我必须解析一个字符串,并将其中的一部分写入控制台。在测试如何在没有太多开销的情况下执行此操作时,我发现我测试的一种方法实际上比 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。但这导致花费了大约两倍的时间。我的猜测是它在每次写入后都会刷新,这会使其变慢。所以我尝试了 Test3,使用 StreamWriter(AutoFlush 关闭),它比 Test1快了大约 25% ,我真的很好奇为什么会这样。还是无法正确地对控制台进行写入?(在添加更多测试用例时注意到一些奇怪的数据......)
有人可以启发我吗?
此外,如果有更好的方法来做到这一点(通过一个字符串并只将它的一部分写入控制台),请随时对此发表评论。