С# Эффективная строка для записи консоли Skip?

C# .NET exe (4.6.1) выводит большое количество информации о состоянии, вызывая метод, выполняющий Console.Writeline. Настолько, что это заметно замедляет выполнение. Первой мыслью было добавить логическое значение и/или не выполнять Writeline в вызываемом методе на основе значения. Однако, если исполняемый файл выполняет 4000 строк записи, это 4000 проверок, что кажется чрезмерным.

Как правильно закоротить выход? Способ сделать Console.SetOut как-то нулевым?

Спасибо.


person Snowy    schedule 23.04.2016    source источник
comment
Я думаю, что bool будет довольно легко по сравнению с вызовом Console.Writeline   -  person cost    schedule 23.04.2016
comment
Конечно, вы ничего не будете выводить в своей сборке релиза? Просто добавьте директиву компилятора #if DEBUG.   -  person Luke Joshua Park    schedule 23.04.2016
comment
Проверка bool будет намного быстрее, чем любой доступ к Console. Вы действительно профилировали свое приложение, чтобы увидеть, сколько на самом деле стоит сравнение bool? Я бы подозревал, что нет, иначе вы бы не удосужились задать этот вопрос. Единственная оптимизация, которую вы можете иметь, - это вообще не использовать весь метод, который выполняет WriteLine - полностью удалите его, если вы не включите его для целей отладки или отслеживания.   -  person Ken White    schedule 23.04.2016


Ответы (2)


Вы можете использовать делегатов для решения этой проблемы, хотя я уверен, что проверка логических значений, вероятно, значительно быстрее, чем Console.WriteLine().

Добавьте делегата в класс:

public delegate void Output(string message);

Затем при запуске приложения вы можете проверить свой bool и назначить метод для запуска в зависимости от того, хотите ли вы на самом деле писать или нет.

bool logInformation = true;

if(logInformation)
{
    ProcessInformation((s) => { Console.WriteLine(s); });
}
else
{
    ProcessInformation((s) => { });
}

И, наконец, добавьте делегата в сигнатуру вашего метода для вашего метода обработки.

private void ProcessInformation(Output logger)
{
    // doing stuff, time to write
    logger("test");
}

Вам нужно будет заменить вызовы Console.WriteLine на logger(), но это позволит вам запускать вещи, не беспокоясь о проверке логического значения каждый раз. Тем не менее, я не знаю, действительно ли это быстрее, чем каждый раз проверять логическое значение, но, вероятно, его проще реализовать и поддерживать.

person exceptionthrown    schedule 23.04.2016

Чтобы ответить на ваш точный вопрос:

Console.SetOut(TextWriter.Null);

Но вызов System.Diagnostics TraceEvent дает гораздо более детальный контроль над тем, что вы выводите. Например, в prod можно было выводить только сообщения "Error", а в development можно было выводить свои подробные логи. https://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource.traceevent(v=vs.110).aspx

person adotout    schedule 23.04.2016