Я пытался использовать ObjectIDGenerator в C # для генерации уникального идентификатора во время сериализации, однако этот класс недоступен в платформах XBox360 или Windows Phone 7 .NET (они используют компактную версию .NET). Я реализовал версию с использованием словаря Object для Int64 и смог получить полностью рабочую версию, однако производительность неудовлетворительная. Я сериализирую порядка десятков тысяч объектов, и в настоящее время это самое большое узкое место в производительности сохранения / загрузки. При использовании фактической реализации .NET на ПК для сериализации около 20 000 объектов требуется около 0,3 секунды. Используя мою реализацию, это занимает около 6 секунд.
В профилировании я обнаружил, что в словарь были включены .TryGetValue и .Add (это имеет смысл, так как это как индексирование, так и добавление в хэш-карту). Что еще более важно, оператор виртуального равенства вызывался вместо простого сравнения ссылок, поэтому я реализовал IEqualityComparer, который использовал только ReferenceEquals (это привело к увеличению скорости).
Кто-нибудь имеет представление о лучшей реализации ObjectIDGenerator? Спасибо за вашу помощь!
Моя реализация: http://pastebin.com/H1skZwNK
[Изменить]
Еще одно замечание: результаты профилирования говорят о том, что сравнение объектов / ReferenceEquals по-прежнему является узким местом с количеством посещений 43 000 000. Мне интересно, есть ли способ хранить данные вдоль этого объекта без необходимости искать его в хэш-карте ...