最快的数组初始化

本文关键字:初始化 数组 | 更新日期: 2023-09-27 18:32:06

在我的应用程序中,我需要一个大的常量(实际上是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 字符串。

最快的数组初始化

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

您可以使用

一个IEnumerable<yourobj>,它可以让您仅在需要时延迟返回枚举。

这样做的问题是您将无法像使用数组那样索引到它。