为什么Console.WriteLine在C#(1 +“”)快于Console.WriteLine(我)?

问题描述 投票:-2回答:1

我测试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()组合?

Notes:

  1. 我用百万次迭代的非控制台的东西,1000我的控制台测试。
  2. 我使用的.NET Framework 4.7.1
  3. 该代码是在Visual Studio 2017年(版本15.9.4)与调试配置编译。发布给了类似的结果。
  4. 项目类型为控制台应用程序。
  5. 代码可以作为一个GitHub Gist
c# performance type-conversion console.writeline
1个回答
2
投票

当我看了看源代码,我看到了这一点:

i + "" = String.Concat(object)哪个呼叫obj.ToString()还有一个String.Concat(object)。因此,它是慢。

1路)为Console.WriteLine,它很简单:

    public static void WriteLine(String value)
    {
        Out.WriteLine(value);
    }

https://referencesource.microsoft.com/#mscorlib/system/console.cs,5ac7c4fda643413b

Internaly它创建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)两次。它可以是放缓,但我不能告诉是肯定的。它只是暗示,问题出在哪里都可以。

编辑:

Additionaly 2号路,它调用int.ToString(IFormatProvider)得到一些字符串表示这里是另一个开销,这会慢下来一点,因为它可以让每一个时间提供程序的实例。 https://referencesource.microsoft.com/#mscorlib/system/globalization/numberformatinfo.cs,9c4284b5db21c23a

© www.soinside.com 2019 - 2024. All rights reserved.