ObjectIDGenerator implementation
本文关键字:implementation ObjectIDGenerator | 更新日期: 2023-09-27 18:11:30
我试图在c#中使用ObjectIDGenerator在序列化期间生成唯一的ID,然而,这个类在XBox360或Windows Phone 7 . net框架中不可用(他们使用。net的精简版本)。我使用Object to Int64的字典实现了一个版本,并且能够得到一个完全工作的版本,但是,性能不令人满意。我正在序列化数以万计的对象,目前这是save/load性能的最大瓶颈。在PC上使用实际的。net实现,序列化大约20,000个对象大约需要0.3秒。使用我的实现,大约需要6秒。
在分析中,我发现最重要的是字典上的。trygetvalue和。add(这是有意义的,因为它既索引又添加到哈希映射)。更重要的是,调用了虚拟相等操作符,而不是简单地比较引用,所以我实现了一个只使用ReferenceEquals的IEqualityComparer(这导致了速度的提高)。
有没有人有一个洞察到一个更好的实现ObjectIDGenerator?谢谢你的帮助!
我的实现:http://pastebin.com/H1skZwNK
[编辑]另一个注意事项,分析的结果表明对象比较/ReferenceEquals仍然是瓶颈,命中计数为43,000,000。我想知道是否有一种方法可以将数据存储在这个对象旁边,而不必在哈希映射中查找它…
是否可以为每个对象使用Int32
Id属性/句柄而不是Object
?这可能会有所帮助。看起来你给每个对象分配了一个Id类型编号,只是你是根据对象引用而不是Id来查找的。您可以在每个对象中持久化对象id(您的Int64
)并将您的字典改为Dictionary<Int64, Object>
吗?
您可能还想看看SortedDictionary<TKey, TValue>
或SortedList<TKey, TValue>
的性能是更好还是更差。但是,如果您的主要瓶颈是在您的IEqualityComparer
,这些可能没有太大帮助。
在看了ObjectIDGenerator
类API之后,我可以看到为什么你不能做我一开始建议的;您正在创建id !
ObjectIDGenerator
似乎是手动实现自己的哈希表(它分配了一个object[]
和一个并行的long[]
,并在添加对象时调整它们的大小)。它还使用RuntimeHelpers.GetHashCode(Object)
来计算它的哈希值,而不是使用IEqualityComparer
,这可能会大大提高你的性能,因为它总是调用Object.GetHashCode()
,而不是对派生类型进行虚拟调用(或者在你使用IEqualityComparer
的情况下进行接口调用)。
您可以通过Microsoft共享源代码计划查看源代码: