Почему Console.WriteLine (i + "") быстрее, чем Console.WriteLine (i) в C #? - PullRequest
0 голосов
/ 03 февраля 2019

Я тестировал скорость 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 Console.WriteLine вызывает 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 Ответ

0 голосов
/ 03 февраля 2019

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

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

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

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

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

https://referencesource.microsoft.com/#mscorlib/system/console.cs,82d5745bf4a5ecc6

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

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

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

...