Какой способ кодирования более эффективен: повторное использование переменной против записи одного и того же кода дважды? - PullRequest
0 голосов
/ 24 марта 2020

Позвольте мне дать вам 2 варианта кодирования:

A)

Console.WriteLine(String.Format("Error: {0}", genericException.Message));
SomeTextFileLogMethod(String.Format("Error: {0}", genericException.Message));

B)

var errorMessage = "String.Format("Error: {0}", genericException.Message)";
Console.WriteLine(errorMessage);
SomeTextFileLogMethod(errorMessage);

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

B) более «эффективен» с точки зрения поддержки кода, поскольку вы определяете строку только один раз.

Он также вызывает String.Format один раз вместо двух.

0 голосов
/ 24 марта 2020

Интуитивно понятно, что вызов String.Format дважды повлечет за собой удвоение эксплуатационных расходов. В этой демонстрации вы увидите промежуточный язык, сгенерированный кодом, аналогичным тому, что вы делаете. Вы можете видеть, что дважды "работа" выполняется после then .... Разница ничтожна. Кроме того, компилятор может выполнять оптимизации, которые неочевидны, поэтому всегда рекомендуется проводить сравнительный анализ, если есть обоснованная озабоченность по поводу производительности.

Если вы действительно хотите кодировать эффективную запись в журнал и обмен сообщениями, я предлагаю использовать специально предназначенную для этого библиотеку. Нечто подобное Serilog можно настроить для записи в несколько «приемников». Таким образом, один вызов для записи сообщения может go на консоль, и файл, и электронное письмо, и конечную точку http, et c., Et c.

string msg = string.Format("Error: {0}", "test");

Console.WriteLine(msg);
Debug.WriteLine(msg);

Debug.Write("then...");

Console.WriteLine(string.Format("Error: {0}", "test"));
Debug.WriteLine(string.Format("Error: {0}", "test"));

IL_0000:  nop         
IL_0001:  ldstr       "Error: {0}"
IL_0006:  ldstr       "test"
IL_000B:  call        System.String.Format
IL_0010:  stloc.0     // msg
IL_0011:  ldloc.0     // msg
IL_0012:  call        System.Console.WriteLine
IL_0017:  nop         
IL_0018:  ldloc.0     // msg
IL_0019:  call        System.Diagnostics.Debug.WriteLine
IL_001E:  nop         
IL_001F:  ldstr       "then..."
IL_0024:  call        System.Diagnostics.Debug.Write
IL_0029:  nop         
IL_002A:  ldstr       "Error: {0}"
IL_002F:  ldstr       "test"
IL_0034:  call        System.String.Format
IL_0039:  call        System.Console.WriteLine
IL_003E:  nop         
IL_003F:  ldstr       "Error: {0}"
IL_0044:  ldstr       "test"
IL_0049:  call        System.String.Format
IL_004E:  call        System.Diagnostics.Debug.WriteLine
IL_0053:  nop         
IL_0054:  ret 
...