如果一个类只有一个方法可能多次但很少被调用,那么不要以传统方式调用该方法,如下所示
RarelyCalledClass orarelyCalled = new RarelyCalledClass();
orarelyCalled.rarelyCalledMethod();
我可以这样称呼它吗?
(new RarelyCalledClass()).rarelyCalledMethod();
这会提高性能,因为编译器必须做更少的操作。
如果一个类只有一个方法可能多次但很少被调用,那么不要以传统方式调用该方法,如下所示
RarelyCalledClass orarelyCalled = new RarelyCalledClass();
orarelyCalled.rarelyCalledMethod();
我可以这样称呼它吗?
(new RarelyCalledClass()).rarelyCalledMethod();
这会提高性能,因为编译器必须做更少的操作。
这将是完全相同的性能和代码。只是您无法再在代码中访问该实例。而且可读性也更差(在我和大多数人看来)。
还有一点你应该牢记在心:过早的微优化是邪恶的。
分析您的应用程序。这是一个真正的瓶颈吗?不?那就别打扰了。
由于编译器必须做更少的操作,这会提高性能吗?
我相信你可以用任何反编译器检查他们的 IL 代码,你也会看到同样的东西。
第一个 IL 代码;
.locals init ([0] class _1.RarelyCalledClass orarelyCalled)
IL_0000: nop
IL_0001: newobj instance void _1.RarelyCalledClass::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: callvirt instance void _1.RarelyCalledClass::rarelyCalledMethod()
IL_000d: nop
IL_000e: ret
秒一IL码;
.maxstack 8
IL_0000: nop
IL_0001: newobj instance void _1.RarelyCalledClass::.ctor()
IL_0006: call instance void _1.RarelyCalledClass::rarelyCalledMethod()
IL_000b: nop
IL_000c: ret
基于这种结构;
static void Main(string[] args)
{
//
}
}
class RarelyCalledClass
{
public RarelyCalledClass()
{
}
public void rarelyCalledMethod()
{
Console.WriteLine("Test");
}
}
唯一的区别是您的第一个代码使用stloc
nadldloc
处理堆栈问题,第二个没有。
除非您稍后在某处使用该实例,否则编译后应该是相同的。但是ILSpy显示出不同:
第一版(带作业)
.method private hidebysig static
void Main (
string[] args
) cil managed
{
// Method begins at RVA 0x2058
// Code size 13 (0xd)
.maxstack 1
.entrypoint
.locals init (
[0] class ConsoleApplication1.TestClass obj
)
IL_0000: newobj instance void ConsoleApplication1.TestClass::.ctor()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: callvirt instance void ConsoleApplication1.TestClass::TestMethod()
IL_000c: ret
} // end of method Program::Main
第二版(未分配)
.method private hidebysig static
void Main (
string[] args
) cil managed
{
// Method begins at RVA 0x2058
// Code size 11 (0xb)
.maxstack 8
.entrypoint
IL_0000: newobj instance void ConsoleApplication1.TestClass::.ctor()
IL_0005: call instance void ConsoleApplication1.TestClass::TestMethod()
IL_000a: ret
} // end of method Program::Main
两者都是在发布模式下构建的。