Как я могу оперативно назначить уникальные идентификаторы для объектов в C#

Я работаю над библиотекой C#, которая будет создавать тонны небольших объектов как часть нормальной работы (например, узлы AST в компиляторе). Я хотел бы назначить каждому экземпляру уникальный идентификатор (уникальный в рамках программы, а не глобально уникальный) таким образом, чтобы не снижать производительность. Объекты являются неизменяемыми и могут быть общими для всех потоков, поэтому идентификатор должен быть уникальным для всех потоков.

Вот несколько вариантов, которые я рассматриваю:

  1. Используйте статический int или long и получайте каждый новый идентификатор с помощью звонков Interlocked.Increment()
  2. использование Guid.NewGuid() генерировать идентификаторы
  3. Используйте статическое int или long поле с [ThreadStatic] атрибут, а затем сделать идентификатор строки из текущего потока ManagedThreadId свойство и следующее значение из локального счетчика потока.

Будет ли один из них более производительным, чем другие? Есть лучший способ сделать это?

Спасибо!

РЕДАКТИРОВАТЬ:
Я провел быстрый тест и получил следующие результаты:

  1. 0,19 секунды (int и long были в основном одинаковыми)
  2. 1,1 секунды
  3. 3,5 секунды

Кажется, это сильно указывает на использование Interlocked, Тем не менее, есть ли риск Interlocked замедление в многопоточных сценариях?

1 ответ

Interlocked.Increment работает, гарантируя, что вызов ++ происходит как атомная операция. Это означает, что другой поток не может получить промежуточную переменную, что может произойти с помощью ++,

Единственная проблема с производительностью - это необходимость синхронизации памяти, в которой хранится переменная, обратите внимание, что эта производительность должна быть незначительной, как показывает ваше тестирование.

Другие вопросы по тегам