Почему Console.WriteLine(i + "") быстрее, чем Console.WriteLine(i) в C#?

Я проверил скорость i.ToString(), i + "", Console.WriteLine(i+"") а также Console.WriteLine(i), (i был int) Результаты были следующими:

i.ToString() (149 мс) было быстрее, чем i + "" (202 мс).

Но когда я использовал Console.WriteLineConsole.WriteLine(i + "") (743 мс) было намного быстрее, чем Console.WriteLine(i) (927 мсек, в соответствии с исходным вызовом Console.WriteLine из источника TextWriter. ToString() внутри).

Теперь мой вопрос: почему i + "" быстрее в сочетании с Console.WriteLine()?

Заметки:

  1. Я использовал 1 000 000 итераций для неконсольных вещей и 1 000 для своих консольных тестов.
  2. Я использую.NET Framework 4.7.1
  3. Код был скомпилирован с настройкой Debug в Visual Studio 2017 (версия 15.9.4). Релиз дает схожие результаты.
  4. Тип проекта - консольное приложение.
  5. Код доступен как GitHub Gist

1 ответ

Решение

Когда я посмотрел на исходный код, я увидел это:

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/

Внутри он создает 1 буфер со значением + '\r\n' и вызывает .Write(char[], int, int) только однажды.

2-й способ) Когда вы вызываете его с помощью int, он отличается.

    public virtual void WriteLine(int value) {
        Write(value);
        WriteLine();
    }

https://referencesource.microsoft.com/

Так он называет Write(char[], int, int) дважды. И это может быть такое замедление, но я не могу сказать наверняка. Это только подсказка, где проблема может быть.

РЕДАКТИРОВАТЬ:

Кроме того, 2-й способ, он вызывает int.ToString(IFormatProvider) чтобы получить строковое представление числа где есть еще одна служебная информация, которая может немного замедлить его, потому что он может каждый раз получать экземпляр этого провайдера. https://referencesource.microsoft.com/#mscorlib/system/globalization/numberformatinfo.cs,9c4284b5db21c23a

Другие вопросы по тегам