Хорошо, для начала ваш звонок на new A()
рассчитывается так, как вы сейчас настроили свой код.Вы должны убедиться, что вы работаете в режиме релиза с включенной оптимизацией.Также вам необходимо принять во внимание JIT - процитировать все пути кода, чтобы вы могли гарантировать, что они скомпилированы до того, как вы их успеете (если вы не беспокоитесь о времени запуска).
Я вижу проблему, когдаВы пытаетесь рассчитать огромное количество примитивных операций (простое дополнение).В этом случае вы не можете сделать никаких окончательных выводов, поскольку любые накладные расходы будут полностью доминировать в ваших измерениях.
edit: в режиме выпуска с таргетингом на .NET 3.5 в VS2008 я получаю:
1719 : 9999999800000000
1337 : 9999999800000000
, чтокажется, согласуется со многими другими ответами.Использование ILDasm дает следующий IL для B.Add:
IL_0000: ldarg.3
IL_0001: ldarg.1
IL_0002: ldarg.2
IL_0003: add
IL_0004: conv.i8
IL_0005: callvirt instance void class [mscorlib]System.Action`1<int64>::Invoke(!0)
IL_000a: ret
Где B.Add2:
IL_0000: ldarg.1
IL_0001: ldarg.2
IL_0002: add
IL_0003: conv.i8
IL_0004: ret
Таким образом, похоже, что вы просто синхронизируете load
и callvirt
.