首页 > 解决方案 > 引入一次性立即使用的变量会导致性能损失吗?

问题描述

我最近试图提高一个副项目的代码质量,我想知道关于缓存的一些事情......

假设我们有以下代码:

if(a || b)

现在,让我们想象一下ab实际上是非常长的操作,例如: element.getValue(anIndexContainer[anotherSubItemCauseReasons])

我要做的当然是让它可读,例如:

bool shouldDoSomething = a || b
// the bool will NEVER be used after the if

if(shouldDoSomething)

我的问题是:这会消耗更多缓存吗?

我的猜测是,由于 bool 是在 the 之前声明的if并且它们从未被重复使用,因此编译会像第一种情况一样对其进行优化。

是否有任何关于 C# 编译器行为的证据/证明/规范?

对于未来的读者:

此链接是编译器所做的示例,感谢@stefano balzarotti 的链接:)

标签: c#performance

解决方案


是否有任何关于 C# 编译器行为的证据/证明/规范?

据我所知,编译器和 JITter(将编译后的字节码转换为机器码)几乎可以做任何他们想要提高性能的事情,而不会改变代码的功能效果。有一些标志会阻止编译器进行这些类型的优化,但这更多是为了调试目的,通过使字节码与源代码更加一致。一旦您告诉编译器进行优化,它就无法控制。

所以是的,编译器(或 JITter)可能会检测到这些变量可以内联并这样做,但你为什么关心呢?以合乎逻辑的方式编写源代码,以便维护它的其他人(或几个月后的您)知道您打算做什么。只有当您有可衡量的性能问题时,您才应该尝试超越编译器。

这可能适用于占用寄存器或堆栈空间的低级语言,但在高级托管语言中,这些都不是大问题。


推荐阅读