简单写了个小程序,比较了一下C#中各种Lock的速度(前提是都没有进入wait状态)。
各进入离开Lock 1kw次,结果如下:
Lock | Time (ms) |
No lock | 58 |
CriticalSection | 726 |
Interlocked | 344 |
Readerslim | 1932 |
Writerslim | 1513 |
Reader | 3754 |
Writer | 3430 |
Mutex | 24998 |
Semaphore | 24197 |
Event | 22549 |
结论如下:
- Interlocked可以直接编译为CPU指令,速度最快,虽然功能较少但能用则用。
- CriticalSection(也就是lock关键字或者Monitor.Enter()方法)仅比Interlocked慢,建议使用。
- 对于ReaderWriterLock和ReaderWriterLockSlim,Slim快近一倍,但缺点是不能track owner,也就是同一线程不能多次进入同一个lock。Reader比Writer要慢,估计是要维护reader count的原因。
- Mutex,Semaphore,Event即使可以获得lock也要进入内核模式,所以最慢,要尽量避免使用。