为什么 Console.WriteLine(i + "") 在 C# 中比 Console.WriteLine(i) 快?
Why is Console.WriteLine(i + "") faster than Console.WriteLine(i) in C#?
我测试了i.ToString()
、i + ""
、Console.WriteLine(i+"")
和Console.WriteLine(i)
的速度。 (i
是一个 int
)
结果如下:
i.ToString()
(149 毫秒)比 i + ""
(202 毫秒)快。
但是当我使用 Console.WriteLine
Console.WriteLine(i + "")
(743 毫秒)比 Console.WriteLine(i)
(927 毫秒,根据 TextWriter source Console.WriteLine 调用快很多ToString()
内部)。
现在我的问题是:为什么 i + ""
与 Console.WriteLine()
结合使用会更快?
备注:
- 我对非控制台内容使用了 1,000,000 次迭代,对我的控制台测试使用了 1,000 次。
- 我使用 .NET Framework 4.7.1
- 代码是在 Visual Studio 2017(版本 15.9.4)中使用 Debug 配置编译的。发布给出了类似的结果。
- 项目类型是控制台应用程序。
- 代码可作为 GitHub Gist
当我查看源代码时,我看到了这个:
i + ""
= String.Concat(object)
调用 obj.ToString()
还有一个String.Concat(object)
。所以比较慢。
第一种方式)使用 Console.WriteLine 很简单:
public static void WriteLine(String value)
{
Out.WriteLine(value);
}
https://referencesource.microsoft.com/#mscorlib/system/console.cs,5ac7c4fda643413b
它在内部创建 1 个具有值 + '\r\n' 的缓冲区,并且只调用一次 .Write(char[], int, int)
。
第二种方式)当你用int调用的时候就不一样了
public virtual void WriteLine(int value) {
Write(value);
WriteLine();
}
https://referencesource.microsoft.com/#mscorlib/system/console.cs,82d5745bf4a5ecc6
这样它会调用 Write(char[], int, int)
两次。可能是这种放缓,但我不能确定。这只是提示,问题可能出在哪里。
编辑:
另外第二种方式,它调用 int.ToString(IFormatProvider)
来获取数字的字符串表示,这是另一个开销,可以稍微减慢它的速度,因为它每次都可以获得该提供者的实例。
https://referencesource.microsoft.com/#mscorlib/system/globalization/numberformatinfo.cs,9c4284b5db21c23a
我测试了i.ToString()
、i + ""
、Console.WriteLine(i+"")
和Console.WriteLine(i)
的速度。 (i
是一个 int
)
结果如下:
i.ToString()
(149 毫秒)比 i + ""
(202 毫秒)快。
但是当我使用 Console.WriteLine
Console.WriteLine(i + "")
(743 毫秒)比 Console.WriteLine(i)
(927 毫秒,根据 TextWriter source Console.WriteLine 调用快很多ToString()
内部)。
现在我的问题是:为什么 i + ""
与 Console.WriteLine()
结合使用会更快?
备注:
- 我对非控制台内容使用了 1,000,000 次迭代,对我的控制台测试使用了 1,000 次。
- 我使用 .NET Framework 4.7.1
- 代码是在 Visual Studio 2017(版本 15.9.4)中使用 Debug 配置编译的。发布给出了类似的结果。
- 项目类型是控制台应用程序。
- 代码可作为 GitHub Gist
当我查看源代码时,我看到了这个:
i + ""
= String.Concat(object)
调用 obj.ToString()
还有一个String.Concat(object)
。所以比较慢。
第一种方式)使用 Console.WriteLine 很简单:
public static void WriteLine(String value)
{
Out.WriteLine(value);
}
https://referencesource.microsoft.com/#mscorlib/system/console.cs,5ac7c4fda643413b
它在内部创建 1 个具有值 + '\r\n' 的缓冲区,并且只调用一次 .Write(char[], int, int)
。
第二种方式)当你用int调用的时候就不一样了
public virtual void WriteLine(int value) {
Write(value);
WriteLine();
}
https://referencesource.microsoft.com/#mscorlib/system/console.cs,82d5745bf4a5ecc6
这样它会调用 Write(char[], int, int)
两次。可能是这种放缓,但我不能确定。这只是提示,问题可能出在哪里。
编辑:
另外第二种方式,它调用 int.ToString(IFormatProvider)
来获取数字的字符串表示,这是另一个开销,可以稍微减慢它的速度,因为它每次都可以获得该提供者的实例。
https://referencesource.microsoft.com/#mscorlib/system/globalization/numberformatinfo.cs,9c4284b5db21c23a