Tre*_*erg 2 .net c# optimization xna cross-platform
我试图在 C# 中使用 ObjectIDGenerator 在序列化期间生成唯一 ID,但是,此类在 XBox360 或 Windows Phone 7 .NET 框架中不可用(它们使用 .NET 的紧凑版本)。我使用 Object to Int64 字典实现了一个版本,并且能够得到一个完整的工作版本,但是,性能并不令人满意。我正在按数万个对象的顺序进行序列化,目前这是保存/加载性能的最大瓶颈。在 PC 上使用实际的 .NET 实现需要大约 0.3 秒来序列化大约 20,000 个对象。使用我的实现,大约需要 6 秒。
在分析中,我发现重击者是字典上的 .TryGetValue 和 .Add (这是有道理的,因为它既是索引又是添加到哈希映射)。更重要的是,调用了虚拟相等运算符而不是简单地比较引用,因此我实现了一个仅使用 ReferenceEquals 的 IEqualityComparer(这导致了速度的提高)。
有没有人深入了解 ObjectIDGenerator 的更好实现?谢谢你的帮助!
我的实现:http : //pastebin.com/H1skZwNK
[编辑] 另一个说明,分析的结果表明对象比较 / ReferenceEquals 仍然是瓶颈,命中计数为 43,000,000。我想知道是否有一种方法可以将数据与此对象一起存储而无需在哈希映射中查找...
是否可以Int32为每个对象使用Id 属性/句柄而不是Object?这可能会有所帮助。看起来您无论如何都为每个对象分配了一个 Id 类型编号,只有然后您才根据对象引用而不是 Id 进行查找。你能Int64在每个对象中保留对象 id (your ) 并将你的字典Dictionary<Int64, Object>改为吗?
您可能还想看看SortedDictionary<TKey, TValue>or 的SortedList<TKey, TValue>表现是否更好或更差。但是,如果您的主要瓶颈在您的IEqualityComparer.
更新
看了ObjectIDGenerator类API,我就明白为什么你不能按照我一开始的建议去做;您正在创建 ID!
ObjectIDGenerator似乎正在手动实现自己的哈希表(它分配一个object[]和一个并行long[]并在添加对象时调整它们的大小)。它还RuntimeHelpers.GetHashCode(Object)用于计算它的散列,而不是IEqualityComparer它可能会大大提高你的性能,因为它总是调用Object.GetHashCode()而不是对派生类型进行虚拟调用(或在你的情况下调用接口IEqualityComparer)。
您可以通过Microsoft 共享源计划查看自己的源代码: