1

我正在开发一个 C# 库,它将创建大量小对象作为正常操作的一部分(想想编译器中的 AST 节点)。我想以不会影响性能的方式为每个实例分配一个唯一标识符(在程序中是唯一的,而不是全局唯一的)。对象是不可变的,并且可以跨线程共享,因此 id 需要在线程之间是唯一的。

以下是我正在考虑的一些选项:

  1. 使用静态 int 或 long,并通过调用获取每个新 idInterlocked.Increment()
  2. 用于Guid.NewGuid()生成 id
  3. 使用带有[ThreadStatic]属性的静态 int 或 long 字段,然后从当前线程的ManagedThreadId属性和线程本地计数器中的下一个值生成字符串 id。

其中一个会比其他的性能更好吗?有一个更好的方法吗?

谢谢!

编辑:
我运行了一个快速基准测试并得到以下结果:

  1. 0.19 秒(int 与 long 基本相同)
  2. 1.1 秒
  3. 3.5 秒

这似乎强烈指向使用Interlocked. 但是,Interlocked在多线程场景中是否存在减速的风险?

4

1 回答 1

2

Interlocked.Increment通过确保调用++作为原子操作发生来工作。这意味着另一个线程无法获取中间变量,这可能使用++.

唯一的性能问题是需要同步存储变量的内存,请注意,此性能成本应该可以忽略不计,正如您的测试所示。

于 2013-02-23T19:41:14.803 回答