在我目前的项目中,我需要解析一个字符串,并将其部分内容写入控制台。在测试如何在没有太多开销的情况下完成此操作时,我发现一种我正在测试的方法实际上比Console.WriteLine更快,这让我有点困惑。
我知道这不是基准测试的“正确”方式,但通常我可以通过运行几次来粗略地判断“这比那个更快”。
正如您所看到的,Test1使用了Console.WriteLine。我的第一个想法是每个字符都调用Write,看看Test2。但结果花费的时间大约是两倍。我猜测它在每次写入后都会刷新,这使它变得更慢。所以我尝试了Test3,使用StreamWriter(AutoFlush关闭),结果比Test1快大约25%,我真的很好奇为什么会这样。还是说无法正确地对控制台写入进行基准测试?(添加更多测试用例时注意到一些奇怪的数据...)
有人能启发我吗?
另外,如果有更好的方法(浏览字符串并仅将其部分写入控制台),请随时评论。
我知道这不是基准测试的“正确”方式,但通常我可以通过运行几次来粗略地判断“这比那个更快”。
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%,我真的很好奇为什么会这样。还是说无法正确地对控制台写入进行基准测试?(添加更多测试用例时注意到一些奇怪的数据...)
有人能启发我吗?
另外,如果有更好的方法(浏览字符串并仅将其部分写入控制台),请随时评论。
Test1
,看是否有明显的差异。我猜测可能存在某种缓存机制。 - keyboardPstream.Flush()
。例如:Console.ForegroundColor = ConsoleColor.Green; stream.Write("This text is green"); stream.Flush(); Console.ForegroundColor = ConsoleColor.Red; stream.Write("This text will be red"); stream.Flush();
- Stefnotch