2

如果一个类只有一个方法可能多次但很少被调用,那么不要以传统方式调用该方法,如下所示

RarelyCalledClass orarelyCalled = new RarelyCalledClass();
orarelyCalled.rarelyCalledMethod();

我可以这样称呼它吗?

(new RarelyCalledClass()).rarelyCalledMethod();

这会提高性能,因为编译器必须做更少的操作。

4

3 回答 3

3

这将是完全相同的性能和代码。只是您无法再在代码中访问该实例。而且可读性也更差(在我和大多数人看来)。

还有一点你应该牢记在心:过早的微优化是邪恶的

分析您的应用程序。这是一个真正的瓶颈吗?不?那就别打扰了。

于 2013-04-10T07:37:13.663 回答
1

由于编译器必须做更少的操作,这会提高性能吗?

不,我不这么认为。

我相信你可以用任何反编译器检查他们的 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");
}
}

唯一的区别是您的第一个代码使用stlocnadldloc处理堆栈问题,第二个没有。

于 2013-04-10T07:37:34.447 回答
0

除非您稍后在某处使用该实例,否则编译后应该是相同的。但是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

两者都是在发布模式下构建的。

于 2013-04-10T07:41:39.550 回答