首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectIDGenerator实现

ObjectIDGenerator实现
EN

Stack Overflow用户
提问于 2011-10-17 12:37:17
回答 1查看 1.4K关注 0票数 2

我曾尝试在序列化过程中使用C#中的ObjectIDGenerator来生成唯一的ID,但是,这个类在XBox360或Windows phone7 .NET框架中不可用(它们使用的是.NET的精简版本)。我使用Int64的对象字典实现了一个版本,并能够获得一个完整的工作版本,然而,性能并不令人满意。我正在序列化数万个对象,目前这是保存/加载性能的最大瓶颈。在PC上使用实际的.NET实现,序列化大约20,000个对象大约需要0.3秒。使用我的实现,大约需要6秒。

在性能分析中,我发现字典上的.TryGetValue和.Add是重量级的(这是有意义的,因为它既是索引又是添加到哈希图中)。更重要的是,调用的是虚拟相等操作符,而不是简单地比较引用,所以我实现了一个只使用ReferenceEquals的IEqualityComparer (这提高了速度)。

有谁有更好的ObjectIDGenerator实现的见解吗?谢谢你的帮忙!

我的实现:http://pastebin.com/H1skZwNK

编辑另一个注释,概要分析的结果表明,对象比较/ ReferenceEquals仍然是瓶颈,命中计数为43,000,000。我想知道是否有一种方法可以将数据与这个对象一起存储,而不必在哈希图中查找它……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-17 13:28:37

是否可以为每个对象而不是Object使用Int32 Id属性/句柄?这可能会有所帮助。看起来您无论如何都是在为每个对象分配一个Id类型号,只是您随后会根据对象引用而不是Id进行查找。您是否可以将对象id (您的Int64)持久化到每个对象中,并将字典转换为Dictionary<Int64, Object>

您可能还想看看SortedDictionary<TKey, TValue>SortedList<TKey, TValue>的性能是更好还是更差。但是,如果您的主要瓶颈在您的IEqualityComparer中,这些可能不会有太大帮助。

更新

在研究了ObjectIDGenerator类API之后,我明白了为什么您不能按照我一开始建议的那样做;您正在创建ids!

ObjectIDGenerator似乎在手动实现自己的哈希表(它分配一个object[]和一个并行long[],并在添加对象时调整它们的大小)。它还使用RuntimeHelpers.GetHashCode(Object)而不是IEqualityComparer来计算其散列,这可能会大大提高您的性能,因为它总是调用Object.GetHashCode(),而不是在派生类型上进行虚拟调用(或者在您使用IEqualityComparer的情况下进行接口调用)。

您可以通过Microsoft Shared Source Initiative自己查看源代码

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7789430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档