未使用变量优化:两种ExampleClass实例化的性能与编译优化疑问
C#实例化对象的性能与编译优化问题
咱们先聊第一个问题:第一种new ExampleClass();的实例化方式会不会更快?
答案是完全不会。不管你有没有把创建出来的对象引用赋值给变量,CLR在实例化对象时执行的核心流程都是一致的:
- 为对象分配内存空间
- 初始化对象的字段(比如把引用类型字段设为
null,值类型设为默认值) - 执行构造函数里的
//Do Stuff代码
这几步一个都不会少,所以两种写法在实例化的性能上没有任何差异。
再说说第二个问题:当变量example从未被使用时,第二种实例化会不会在编译阶段被优化?
这得分情况看:
- 在Release编译模式下,编译器(或者JIT编译器)会做部分优化:它会把未使用的变量
example的声明和赋值操作优化掉,但不会跳过构造函数的执行——因为构造函数里有明确的业务逻辑(//Do Stuff),属于有副作用的代码,编译器不能随意移除这部分逻辑。最终的效果和第一种写法几乎一致,只是少了把对象引用存到变量里的步骤,但这步的开销可以忽略不计。 - 在Debug编译模式下,为了方便调试(比如可以在调试器里查看变量),编译器不会做这类优化,变量
example会被保留下来,整个实例化流程也会完整执行。
内容的提问来源于stack exchange,提问作者Chris Fraser
相关产品推荐
相关产品推荐

