Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插值字符串与串联字符串_C#_Performance_String Interning - Fatal编程技术网

C# 插值字符串与串联字符串

C# 插值字符串与串联字符串,c#,performance,string-interning,C#,Performance,String Interning,我如何测试使用插值字符串和串联字符串的场景中的差异,例如以下示例: 字符串插值 这将很有希望通过字符串插入为所有代码存储一个a值,但使用string.Format的成本可能会抵消存储单个小字符串的好处 串联 这将存储许多不同的字符串,因为它们看起来像是在编译时连接在一起的,所以除了a部分不同之外,您将有许多相同字符串的“相似”副本。优点是没有string.Format调用 我如何评估以一种方式与以另一种方式进行比较的好处?这类事物的基准是否已经存在?这可能取决于您所测量的内容。它是否正在运行内

我如何测试使用插值字符串和串联字符串的场景中的差异,例如以下示例:

字符串插值 这将很有希望通过字符串插入为所有代码存储一个
a
值,但使用
string.Format
的成本可能会抵消存储单个小字符串的好处

串联 这将存储许多不同的字符串,因为它们看起来像是在编译时连接在一起的,所以除了
a
部分不同之外,您将有许多相同字符串的“相似”副本。优点是没有
string.Format
调用



我如何评估以一种方式与以另一种方式进行比较的好处?这类事物的基准是否已经存在?

这可能取决于您所测量的内容。它是否正在运行内存占用?是生成结果字符串的速度(例如在循环中)?如果字符串不是常量,则第二个连接示例也可能会有所不同,通常情况下(来自输入等),它不会像您的IL那样编译为单个字符串。我想说的是,场景各不相同,您可能需要测试每个“代码块”,以提高“性能”。对于列出的示例,IMHO,差异可以忽略不计。这是特定项目的一部分吗?您是否发现性能问题?在这个级别上,您可能会得到一个“视情况而定”的答案。这非常困难,因为…特别是在使用非桌面版本的框架(如Compact framework)时,GC实际上可能最终成为性能等式中最重要的部分。我们最终测量了两个不同编译器的总体性能,其中唯一改变的是字符串处理。给了我们一个非常明确的答案。(对于我们的用例)您可能是对的,在我的大多数情况下,第二个示例可能不是常数,因此在runtime@JoePhillips-不幸的是,我忘记了分析细节,这些细节可能与.NET核心无关。我记得结果是,更“昂贵”的操作减少了内存碎片,并显著提高了相关领域的整体性能。但当然,在这种情况下可能并非如此。
const string a = "I change per class or method";
string b = $"abcdefghijklmnopqrstuvw {a} xyz";
Console.WriteLine(b);

IL_0000:  ldstr       "abcdefghijklmnopqrstuvw {0} xyz"
IL_0005:  ldstr       "I change per class or method"
IL_000A:  call        System.String.Format
IL_000F:  call        System.Console.WriteLine
IL_0014:  ret         
const string a = "I change per class or method";
string b = "abcdefghijklmnopqrstuvw " + a + " xyz";
Console.WriteLine(b);

IL_0000:  ldstr       "abcdefghijklmnopqrstuvw I change per class or method xyz"
IL_0005:  call        System.Console.WriteLine
IL_000A:  ret