C# 中的字符串内插 $对比string.Format

发布时间 2023-10-19 11:32:52作者: _一级菜鸟

原文:https://blog.csdn.net/HeBizhi1997/article/details/123544524

  C# 10.0 对字符串插值做了点提升,支持开发人员对字符串进行花式内插。

  附官方教程:

  https://docs.microsoft.com/zh-cn/dotnet/csharp/tutorials/string-interpolation#code-try-0icon-default.png?t=M276https://docs.microsoft.com/zh-cn/dotnet/csharp/tutorials/string-interpolation#code-try-0

  对比一下string.Format的方式,我想看下层层包装之后,性能上的差别。

  先说下我机器的配置:
  

 

#region 测试代码
var a = 3;
var b = 2;
var list = new List<int>();
Console.WriteLine("strat method one");
for (int j = 0; j < 10; j++)
{
    var dt1 = DateTime.Now;
    //Console.WriteLine(dt1.ToString("HH:mm ffff"));
    for (int i = 0; i < 1_0000_0000; i++)
    {
        var c = $"{a} + {b} = {a + b}";
    }
    var dt2 = DateTime.Now;
    //Console.WriteLine(dt2.ToString("HH:mm ffff"));
    Console.WriteLine("times " + j + " : " + (dt2 - dt1).Milliseconds);
    list.Add((dt2 - dt1).Milliseconds);
}
list.Remove(list.Max());
list.Remove(list.Min());
Console.WriteLine(list.Average());
 
list.Clear();
Console.WriteLine("strat method two");
for (int j = 0; j < 10; j++)
{
    var dt1 = DateTime.Now;
    //Console.WriteLine(dt1.ToString("HH:mm ffff"));
    for (int i = 0; i < 1_0000_0000; i++)
    {
        var c = string.Format("{0} + {1} = {2}", a, b, a + b);
    }
    var dt2 = DateTime.Now;
    //Console.WriteLine(dt2.ToString("HH:mm ffff"));
    Console.WriteLine("times " + j + " : " + (dt2 - dt1).Milliseconds);
    list.Add((dt2 - dt1).Milliseconds);
}
list.Remove(list.Max());
list.Remove(list.Min());
Console.WriteLine(list.Average()); 
#endregion

  输出结果:

  

   结论:从测试结果来说,string.Format占用的cpu资源更稳定,$语法糖就有些飘忽不定。

  但是无论是从功能扩展还是长期性能考虑来看的话,只能说微软牛逼,语法糖真香。

 

  附录:之前的测试代码反编译一下的结果

  

int a = 3;
int b = 2;
List<int> list = new List<int>();
Console.WriteLine("strat method one");
for (int i = 0; i < 10; i++)
{
    DateTime dt = DateTime.Now;
    for (int j = 0; j < 100000000; j++)
    {
        DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(6, 3);
        defaultInterpolatedStringHandler.AppendFormatted<int>(a);
        defaultInterpolatedStringHandler.AppendLiteral(" + ");
        defaultInterpolatedStringHandler.AppendFormatted<int>(b);
        defaultInterpolatedStringHandler.AppendLiteral(" = ");
        defaultInterpolatedStringHandler.AppendFormatted<int>(a + b);
        string c = defaultInterpolatedStringHandler.ToStringAndClear();
    }
    DateTime dt2 = DateTime.Now;
    Console.WriteLine("times " + i.ToString() + " : " + (dt2 - dt).Milliseconds.ToString());
    list.Add((dt2 - dt).Milliseconds);
}
list.Remove(list.Max());
list.Remove(list.Min());
Console.WriteLine(list.Average());
list.Clear();
Console.WriteLine("strat method two");
for (int k = 0; k < 10; k++)
{
    DateTime dt3 = DateTime.Now;
    for (int l = 0; l < 100000000; l++)
    {
        string c2 = string.Format("{0} + {1} = {2}", a, b, a + b);
    }
    DateTime dt4 = DateTime.Now;
    Console.WriteLine("times " + k.ToString() + " : " + (dt4 - dt3).Milliseconds.ToString());
    list.Add((dt4 - dt3).Milliseconds);
}
list.Remove(list.Max());
list.Remove(list.Min());
Console.WriteLine(list.Average());