在我的一个当前项目中,我必须解析一个字符串,并将它的一部分写入控制台。在测试如何在没有太多开销的情况下做到这一点时,我发现我测试的一种方式实际上比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 off),结果比Test1快了约25%,我真的好奇这是为什么。还是写入控制台不能正确地进行基准测试? (在添加更多测试用例时注意到一些奇怪的数据...)
有人能够赐教吗?另外,如果有更好的方法来做到这一点(通过一个字符串并将其中的一部分写入控制台),请随时评论一下。
运行'Test1'最后,看看是否有一个明显的区别。我猜想有一些缓存正在进行。 – keyboardP
我想你需要循环几千次以获得准确的基准? – James
你是否过早地优化? – BAF