using System.Diagnostics;
[System.Runtime.CompilerServices.MethodImpl(
System.Runtime.CompilerServices.MethodImplOptions.NoInlining |
System.Runtime.CompilerServices.MethodImplOptions.NoOptimization)]
public static void Main()
IShape s = new Rectangle();
AbstractShape c = new Circle();
Stopwatch s1 = new Stopwatch();
for(var i = 0; i<100000000; i++) {
Console.WriteLine(s1.ElapsedMilliseconds);
for(var i = 0; i<100000000; i++) {
Console.WriteLine(s1.ElapsedMilliseconds);
[System.Runtime.CompilerServices.MethodImpl(
System.Runtime.CompilerServices.MethodImplOptions.NoInlining |
System.Runtime.CompilerServices.MethodImplOptions.NoOptimization)]
public static int CallStruct(IShape s, int a, int b) {
[System.Runtime.CompilerServices.MethodImpl(
System.Runtime.CompilerServices.MethodImplOptions.NoInlining |
System.Runtime.CompilerServices.MethodImplOptions.NoOptimization)]
public static int CallVirtual(AbstractShape s, int a, int b) {
return s.AbstractDo(a, b);
public abstract class AbstractShape {
public abstract int AbstractDo(int a, int b);
public struct Rectangle: IShape {
[System.Runtime.CompilerServices.MethodImpl(
System.Runtime.CompilerServices.MethodImplOptions.NoInlining |
System.Runtime.CompilerServices.MethodImplOptions.NoOptimization)]
public int Do(int a, int b) {
public class Circle: AbstractShape {
[System.Runtime.CompilerServices.MethodImpl(
System.Runtime.CompilerServices.MethodImplOptions.NoInlining |
System.Runtime.CompilerServices.MethodImplOptions.NoOptimization)]
public override int AbstractDo(int a, int b) {
public interface IShape {