【问题标题】:Never used Variable Optimisation从未使用过变量优化
【发布时间】:2018-04-16 13:25:12
【问题描述】:

如果之前有人问过这个问题,我不放心。没找到。

class Program
{
    static void Main(string[] args)
    {
        new ExampleClass();
        ExampleClass example = new ExampleClass();
    }
}
class ExampleClass
{
    public ExampleClass()
    {
        //Do Stuff
    }
}

第一次初始化更快吗?剂量第二个在编译时得到优化。 (假设从未使用过可变示例)

【问题讨论】:

  • 第一行有什么用处?
  • 你想优化什么?
  • @Camilo Terevinto 它可能不是很好的编程,但你可以在构造函数中做一些事情。然后将它用作方法。
  • 如果构造函数有副作用,那么它真的是糟糕的编程。
  • Might not be good programing but you could do stuff in the constructor.Sorta use it as Method then。为什么要争论可怕的编程实践可能的性能优化/影响/好处/坏处。即使出于好奇而对此进行辩论,这种讨论的“要点”是什么?我的意思是,除了“无论性能影响如何,这都是可怕的做法。不要那样做!”...?

标签: c# performance compilation


【解决方案1】:

第一次初始化更快吗?

没有任何意义重大的方式,那么为什么还要关心呢?但是,为了逗你开心,两个选项的 IL 输出在优化编译时是相同的:

// Methods
.method private hidebysig static 
    void Main (
        string[] args
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 7 (0x7)
    .maxstack 8

    IL_0000: newobj instance void ExampleClass::.ctor()
    IL_0005: pop
    IL_0006: ret
} // end of method Program::Main

所以不,没有区别。

假设变量示例从未使用过

你为什么要实例化一个你永远不会使用的对象?如果你想要实现的只是运行一些初始化逻辑,那么实现一个恰当命名的静态方法:

class ExampleClass
{
     static void Initialize() { // do stuff }
}

你会用一种不那么令人不安的方式来称呼它:

static void Main(string[] args)
{
    ExampleClass.Initialize();
}

【讨论】:

    【解决方案2】:

    我会说编译器在这种情况下所做的事情无关紧要。

    确实,毫无疑问,在这两种情况下,ExampleClass 构造函数中的代码都会被执行。 可能是编译器在这个非常具体(而且相当简单)的场景中优化了内存使用,但是如果从未使用过该变量,那么为什么要创建一个新的 ExampleClass 实例呢?您可能更喜欢实用方法或助手(可能是静态的)。

    一般来说,您使用对象来更好地处理和表示您的数据、保留引用并受益于有用的开发风格和设计模式,例如Dependency Injection

    否则,仅使用方法或静态帮助程序可能就足够了。

    【讨论】:

      猜你喜欢
      • 2016-11-06
      • 2016-07-13
      • 2014-12-23
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2015-12-12
      • 1970-01-01
      相关资源
      最近更新 更多