我正在开发一个 C# 库,它将创建大量小对象作为正常操作的一部分(想想编译器中的 AST 节点)。我想以不会影响性能的方式为每个实例分配一个唯一标识符(在程序中是唯一的,而不是全局唯一的)。对象是不可变的,并且可以跨线程共享,因此 id 需要在线程之间是唯一的。
以下是我正在考虑的一些选项:
- 使用静态 int 或 long,并通过调用获取每个新 id
Interlocked.Increment()
- 用于
Guid.NewGuid()
生成 id - 使用带有
[ThreadStatic]
属性的静态 int 或 long 字段,然后从当前线程的ManagedThreadId
属性和线程本地计数器中的下一个值生成字符串 id。
其中一个会比其他的性能更好吗?有一个更好的方法吗?
谢谢!
编辑:
我运行了一个快速基准测试并得到以下结果:
- 0.19 秒(int 与 long 基本相同)
- 1.1 秒
- 3.5 秒
这似乎强烈指向使用Interlocked
. 但是,Interlocked
在多线程场景中是否存在减速的风险?