使用字符串插值插入常量是否有运行时开销?

时间:2019-07-03 22:34:56

标签: c# performance string-interpolation

我有一个包含3个方法的类,每个方法都启动一个新的System.Diagnostics.Process,在其中传递一些唯一的参数以及所有3个参数所共享的一些标准参数。

为了减少重复,我目前将所有一致的参数存储为类级常量,然后在方法运行时对其进行插值。

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);
}

此插值是否有运行时处理开销?还是因为所有类级变量都是常量,编译器是否会认识到可以在编译时进行插值?

如果不这样做,我是否需要使所有字符串保持不变以实现零运行时插值,像这样?

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);
}

我认识到,只有第二个示例将字符串静态地存储在内存中,而不是基于每个实例,但是我不关心内存占用,只关心在运行时发生多少字符串插值。

1 个答案:

答案 0 :(得分:2)

我写了一个简短的程序,然后通过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)

看起来它变成了字符串。Format调用并在运行时进行计算。

是的,对性能的影响非常小。