Skip to main content
 首页 » 编程设计

c#之哪个更快,带锁的函数调用还是虚拟调用

2024年01月13日29Terrylee

我有一个目前不需要线程安全的类,但将来我们可能想制作一个线程安全的版本。在我看来,我现在可以通过在相关函数周围加锁来使其成为线程安全的,或者我现在可以使它们成为虚拟的,然后在后代类的重写中将它们加锁。也就是说,今天我可以这样做:

public void DoStuff() 
{ 
    lock (this.SyncRoot) 
    { 
        // Do stuff... 
    } 
} 

或者我可以这样做:

public virtual void DoStuff() 
{ 
    // Do stuff... 
} 

今天,哪个选项可以更快地完成工作?

请您参考如下方法:

虚函数调用基本上是一个数组查找加上一个间接函数调用。如果虚调用发生在一个循环中,即如果虚函数调用在同一个实例的同一个地方被多次调用,那么在大多数迭代中,它不会比非内联的普通函数调用慢。现代 CPU 分支预测器预测虚函数调用的目标,并在获取函数地址的同时推测性地执行该目标。

另一方面,锁在幕后总是涉及至少一两个原子操作。此类操作几乎肯定会对 CPU 管道造成严重破坏,因为它们需要内存屏障。