Почему Console.WriteLine(i + "") быстрее, чем Console.WriteLine(i) в 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 мсек, в соответствии с исходным вызовом Console.WriteLine из источника TextWriter. ToString()
внутри).
Теперь мой вопрос: почему i + ""
быстрее в сочетании с Console.WriteLine()
?
Заметки:
- Я использовал 1 000 000 итераций для неконсольных вещей и 1 000 для своих консольных тестов.
- Я использую.NET Framework 4.7.1
- Код был скомпилирован с настройкой Debug в Visual Studio 2017 (версия 15.9.4). Релиз дает схожие результаты.
- Тип проекта - консольное приложение.
- Код доступен как 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