Stupid Micro Benchmarking: Proxy Performance
Let us take a look at this class:
public class Trivial { public void EmptyStandard() { } public virtual void EmptyVirtual() { } [MethodImpl(MethodImplOptions.NoInlining)] public void EmptyNoInline() { } [MethodImpl(MethodImplOptions.NoInlining)] public virtual void EmptyVirtualNoInline() { } }
Now let us see what is the effect of using Dynamic Proxy on performance, here is the test rig:
int count = 100000000; var trivial = new Trivial(); Stopwatch sp = Stopwatch.StartNew(); for (int i = 0; i < count; i++) trivial.EmptyStandard(); Console.WriteLine("EmptyStandard: " + sp.ElapsedMilliseconds); sp.Reset(); sp.Start(); for (int i = 0; i < count; i++) trivial.EmptyVirtual(); Console.WriteLine("EmptyVirtual: " + sp.ElapsedMilliseconds); sp.Reset(); sp.Start(); for (int i = 0; i < count; i++) trivial.EmptyNoInline(); Console.WriteLine("EmptyNoInline: " + sp.ElapsedMilliseconds); sp.Reset(); sp.Start(); for (int i = 0; i < count; i++) trivial.EmptyVirtualNoInline(); Console.WriteLine("EmptyVirtualNoInline: " + sp.ElapsedMilliseconds); trivial = (Trivial)new ProxyGenerator().CreateClassProxy(typeof (Trivial)); sp.Reset(); sp.Start(); for (int i = 0; i < count; i++) trivial.EmptyVirtual(); Console.WriteLine("Proxy EmptyVirtual: " + sp.ElapsedMilliseconds); sp.Reset(); sp.Start(); for (int i = 0; i < count; i++) trivial.EmptyVirtualNoInline(); Console.WriteLine("Proxy EmptyVirtualNoInline: " + sp.ElapsedMilliseconds);
The result of this is:
EmptyStandard: 382
EmptyVirtual: 397
EmptyNoInline: 557
EmptyVirtualNoInline: 520
Proxy EmptyVirtual: 6628
Proxy EmptyVirtualNoInline: 6372
On first glance, it is horrible, using a proxy have a 10x perf penalty. But notice just how many times I am running the code. a hundred million times, to be able to get anything observable.
As usual, this micro benchmark basically means that I don't really care about such things :-)

Comments
Comment preview