为什么 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. 我对非控制台内容使用了 1,000,000 次迭代,对我的控制台测试使用了 1,000 次。
  2. 我使用 .NET Framework 4.7.1
  3. 代码是在 Visual Studio 2017(版本 15.9.4)中使用 Debug 配置编译的。发布给出了类似的结果。
  4. 项目类型是控制台应用程序。
  5. 代码可作为 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