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。我想知道是否有一种方法可以将数据存储在这个对象旁边,而不必在哈希映射中查找它…

ObjectIDGenerator implementation

是否可以为每个对象使用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共享源代码计划查看源代码: