使用字符串插值插入常量是否有 运行 次开销?
Is there a run-time overhead to using string interpolation to insert a constant?
我有一个 class,它有 3 个方法,每个方法都启动一个新的 System.Diagnostics.Process
,其中传递了一些独特的参数以及所有 3 个共享的一些标准参数。
为了减少重复,我目前将所有一致的参数存储为 class 级常量,然后将它们作为方法 运行s.
进行插值
private const string File = "file.exe";
private const string StandardAgs = "--whatever";
public void DoA()
{
string command = $"{File} unique args for A {StandardAgs}";
Process.Start(command);
}
public void DoB()
{
string command = $"{File} unique args for B {StandardAgs}";
Process.Start(command);
}
public void DoC()
{
string command = $"{File} unique args for C {StandardAgs}";
Process.Start(command);
}
此插值是否有 运行 时间的处理开销?或者,因为所有 class 级变量都是常量,编译器会识别它们可以在编译时进行插值吗?
否则,我是否需要让我的所有字符串保持不变才能实现零 运行 时间插值,就像这样?
private const string File = "file.exe";
private const string StandardAgs = "--whatever";
private const string Acommand = $"{File} unique args for A {StandardAgs}";
private const string Bcommand = $"{File} unique args for B {StandardAgs}";
private const string Ccommand = $"{File} unique args for C {StandardAgs}";
public void DoA()
{
Process.Start(Acommand);
}
public void DoB()
{
Process.Start(Bcommand);
}
public void DoC()
{
Process.Start(Ccommand);
}
我认识到只有第二个示例将字符串静态存储在内存中而不是基于每个实例,但我不关心内存占用,只关心在 运行 时间发生了多少字符串插值.
我写了一个简短的程序,然后 运行 通过 ILSpy。
c#:
const string Foo = "Hello";
static void Main()
{
var bar = $"{Foo}Bar!";
Console.WriteLine(bar);
}
IL:
IL_0001: ldstr "{0}Bar!"
IL_0006: ldstr "Hello"
IL_000b: call string [mscorlib]System.String::Format(string, object)
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: call void [mscorlib]System.Console::WriteLine(string)
看起来它变成了一个 string.Format 调用并在 运行 时间计算。
所以是的,对性能有(非常非常小的)影响。
我有一个 class,它有 3 个方法,每个方法都启动一个新的 System.Diagnostics.Process
,其中传递了一些独特的参数以及所有 3 个共享的一些标准参数。
为了减少重复,我目前将所有一致的参数存储为 class 级常量,然后将它们作为方法 运行s.
进行插值private const string File = "file.exe";
private const string StandardAgs = "--whatever";
public void DoA()
{
string command = $"{File} unique args for A {StandardAgs}";
Process.Start(command);
}
public void DoB()
{
string command = $"{File} unique args for B {StandardAgs}";
Process.Start(command);
}
public void DoC()
{
string command = $"{File} unique args for C {StandardAgs}";
Process.Start(command);
}
此插值是否有 运行 时间的处理开销?或者,因为所有 class 级变量都是常量,编译器会识别它们可以在编译时进行插值吗?
否则,我是否需要让我的所有字符串保持不变才能实现零 运行 时间插值,就像这样?
private const string File = "file.exe";
private const string StandardAgs = "--whatever";
private const string Acommand = $"{File} unique args for A {StandardAgs}";
private const string Bcommand = $"{File} unique args for B {StandardAgs}";
private const string Ccommand = $"{File} unique args for C {StandardAgs}";
public void DoA()
{
Process.Start(Acommand);
}
public void DoB()
{
Process.Start(Bcommand);
}
public void DoC()
{
Process.Start(Ccommand);
}
我认识到只有第二个示例将字符串静态存储在内存中而不是基于每个实例,但我不关心内存占用,只关心在 运行 时间发生了多少字符串插值.
我写了一个简短的程序,然后 运行 通过 ILSpy。
c#:
const string Foo = "Hello";
static void Main()
{
var bar = $"{Foo}Bar!";
Console.WriteLine(bar);
}
IL:
IL_0001: ldstr "{0}Bar!"
IL_0006: ldstr "Hello"
IL_000b: call string [mscorlib]System.String::Format(string, object)
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: call void [mscorlib]System.Console::WriteLine(string)
看起来它变成了一个 string.Format 调用并在 运行 时间计算。
所以是的,对性能有(非常非常小的)影响。