为什么Console.WriteLine(i +“”)比C#中的Console.WriteLine(i)快?

时间:2019-02-02 23:27:05

标签: c# performance type-conversion console.writeline

我测试了i.ToString()i + ""Console.WriteLine(i+"")Console.WriteLine(i)的速度。 (iint) 结果如下:

i.ToString()(149毫秒)比i + ""(202毫秒)快。

但是当我使用Console.WriteLine Console.WriteLine(i + "")(743毫秒)时,比Console.WriteLine(i)(927毫秒,根据TextWriter source Console快得多。WriteLine调用{{1} }内部)。

现在我的问题是:为什么ToString()i + ""结合使用更快?

注意:

  1. 对于非控制台内容,我使用了1,000,000次迭代,对于控制台测试,我使用了1,000次。
  2. 我使用.NET Framework 4.7.1
  3. 该代码是使用Visual Studio 2017(版本15.9.4)中的Debug配置编译的。发布会产生相似的结果。
  4. 项目类型为控制台应用程序。
  5. 代码以GitHub Gist
  6. 的形式提供

1 个答案:

答案 0 :(得分:2)

当我查看源代码时,我看到了:

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

内部,它将创建一个带有值+'\ 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