【问题标题】:Performance cost of creating array of constants as function argument创建常量数组作为函数参数的性能成本
【发布时间】:2015-02-27 03:22:18
【问题描述】:

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

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

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

CLR 中是否有一种魔法(或优化,如果你不相信魔法的话)可以避免每次都分配和初始化数组,还是每次执行这段代码时都真的构造了数组?我在广义上询问 CLR,如果有这样的事情,也狭隘地询问微软在 .NET 中的具体实现。

【问题讨论】:

    标签: .net arrays memory-management clr


    【解决方案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。我建议您阅读以了解更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      相关资源
      最近更新 更多