【问题标题】:Quickest Array Initialization?最快的数组初始化?
【发布时间】:2012-04-22 23:04:17
【问题描述】:

在我的一个应用程序中,我需要一个大型常量(实际上是static readonly)对象数组。数组在类型的静态构造函数中初始化。

该数组包含一千多个项目,当第一次使用该类型时,我的程序遇到了严重的减速。我想知道是否有办法在 C# 中快速初始化一个大数组。

public static class XSampa {
    public class XSampaPair : IComparable<XSampaPair> {
        public XSampaPair GetReverse() {
            return new XSampaPair(Key, Target);
        }
        public string Key { get; private set; }
        public string Target { get; private set; }
        internal XSampaPair(string key, string target) {
            Key = key;
            Target = target;
        }
        public int CompareTo(XSampaPair other) {
            if (other == null)
                throw new ArgumentNullException("other", 
                        "Cannot compare with Null.");
            if (Key == null)
                throw new NullReferenceException("Key is null!");
            if (other.Key == null)
                throw new NullReferenceException("Key is null!");
            if (Key.Length == other.Key.Length)
                return string.Compare(Key, other.Key, 
                        StringComparison.InvariantCulture);
            return other.Key.Length - other.Key;
        }
    }    
    private static readonly XSampaPair[] pairs, reversedPairs;
    public static string ParseXSampaToIpa(this string xsampa) {
        // Parsing code here...
    }
    public static string ParseIpaToXSampa(this string ipa) {
        // reverse code here...
    }
    static XSampa() {
        pairs = new [] {
            new XSampaPair("a", "\u0061"), 
            new XSampaPair("b", "\u0062"),
            new XSampaPair("b_<", "\u0253"), 
            new XSampaPair("c", "\u0063"),
            // And many more pairs initialized here...
        };
        var temp = pairs.Select(x => x.GetReversed());
        reversedPairs = temp.ToArray();
        Array.Sort(pairs);
        Array.Sort(reversedPairs);
    }
}

PS:我使用数组将 X-SAMPA 音标转换为具有相应 IPA 字符的 Unicode 字符串。

【问题讨论】:

  • 是否可以使用IEnumerable&lt;yourobj&gt;,以便您可以根据需要懒惰地返回数组?
  • @jb 的解决方案很好,但是如果你不想修改任何代码,你可以在应用程序启动时简单地初始化它,也许是闪屏..
  • 抱歉修改后请忽略
  • 不能有闪屏,一切都必须能在服务器端运行。

标签: c# arrays performance


【解决方案1】:

您可以将完全初始化的 onject 序列化为二进制文件,将该文件添加为资源,并在启动时将其加载到您的数组中。如果您的构造函数是 CPU 密集型的,您可能会得到改进。由于您的代码似乎执行了某种解析,因此在那里获得不错改进的机会相当高。

【讨论】:

  • 是否可以将二进制资源直接映射到某个内存并使pairs 指向该内存... à la C++?
  • 您只能使用blittable value types 并且只能在非托管代码中完成类似的操作。您不会将资源映射到内存 - 您只需从资源流中加载它,但它通常非常快。然而,这样做的结果是您最终会在内存中使用值类型,这需要特别注意避免复制。
  • 这会独立于架构(x64 与 x86)和框架版本独立(.net 3 与 .net 2)吗?序列化不是我的强项。
  • @Minustar 由于您将反序列化代码与序列化数据一起发送,因此您不会容易出现框架版本不匹配的情况。就硬件架构而言,.NET 的架构可以为您处理好它。
【解决方案2】:

您可以使用IEnumerable&lt;yourobj&gt;,它可以让您懒惰地仅在需要时返回可枚举的值。

这样做的问题是您无法像使用数组那样对其进行索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2016-05-27
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多