Как я могу оперативно назначить уникальные идентификаторы для объектов в C#
Я работаю над библиотекой C#, которая будет создавать тонны небольших объектов как часть нормальной работы (например, узлы AST в компиляторе). Я хотел бы назначить каждому экземпляру уникальный идентификатор (уникальный в рамках программы, а не глобально уникальный) таким образом, чтобы не снижать производительность. Объекты являются неизменяемыми и могут быть общими для всех потоков, поэтому идентификатор должен быть уникальным для всех потоков.
Вот несколько вариантов, которые я рассматриваю:
- Используйте статический int или long и получайте каждый новый идентификатор с помощью звонков
Interlocked.Increment()
- использование
Guid.NewGuid()
генерировать идентификаторы - Используйте статическое int или long поле с
[ThreadStatic]
атрибут, а затем сделать идентификатор строки из текущего потокаManagedThreadId
свойство и следующее значение из локального счетчика потока.
Будет ли один из них более производительным, чем другие? Есть лучший способ сделать это?
Спасибо!
РЕДАКТИРОВАТЬ:
Я провел быстрый тест и получил следующие результаты:
- 0,19 секунды (int и long были в основном одинаковыми)
- 1,1 секунды
- 3,5 секунды
Кажется, это сильно указывает на использование Interlocked
, Тем не менее, есть ли риск Interlocked
замедление в многопоточных сценариях?
1 ответ
Interlocked.Increment
работает, гарантируя, что вызов ++
происходит как атомная операция. Это означает, что другой поток не может получить промежуточную переменную, что может произойти с помощью ++
,
Единственная проблема с производительностью - это необходимость синхронизации памяти, в которой хранится переменная, обратите внимание, что эта производительность должна быть незначительной, как показывает ваше тестирование.