创建常量数组作为函数参数的性能成本

时间:2014-12-30 23:51:58

标签: .net arrays memory-management clr

这是一个例子。假设我想使用String.Split()方法在多个分隔符上拆分字符串。这是我在C#中写的内容:

    myString.Split(new [] { ',', ';', ':' }, StringSplitOptions.RemoveEmptyEntries)

现在,函数的实际参数是一个常量数组(即在编译/ JIT时间已知)值,并且每次在表达式求值时,此数组至少在语法上被分配。

在CLR中是否存在魔法(或优化,如果你不相信魔法),这将避免每次分配和初始化数组,或者每次执行此代码时是否真的构造了数组?我一般都会广泛地询问CLR,如果有这样的话,还要特别关注微软在.NET中的实现。

1 个答案:

答案 0 :(得分:1)

不,每次都会分配数组。在平均情况下可能不是什么大问题,但很可能是在一个紧凑的循环中,或者经常被调用(比如在繁忙的服务器上等)。

总之,如果您在这里受苦,最好将典型的分隔符数组放在辅助类中,如下所示:

public static class SplitHelpers 
{
   public static readonly char[] Comma = { ',' };
   public static readonly char[] Stuff = { ',', ':', ';' };
   // etc.
}

然后在您的通话网站上使用这些:

myString.Split(SplitHelpers.Stuff, StringSplitOptions.RemoveEmptyEntries)

信用,在信用到期的情况下,Marc Gravell就此问题撰写了pretty good blog post。我建议你阅读更多细节。