c# - 引入一次性立即使用的变量会导致性能损失吗?
问题描述
我最近试图提高一个副项目的代码质量,我想知道关于缓存的一些事情......
假设我们有以下代码:
if(a || b)
现在,让我们想象一下a
,b
实际上是非常长的操作,例如:
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# 编译器行为的证据/证明/规范?
据我所知,编译器和 JITter(将编译后的字节码转换为机器码)几乎可以做任何他们想要提高性能的事情,而不会改变代码的功能效果。有一些标志会阻止编译器进行这些类型的优化,但这更多是为了调试目的,通过使字节码与源代码更加一致。一旦您告诉编译器进行优化,它就无法控制。
所以是的,编译器(或 JITter)可能会检测到这些变量可以内联并这样做,但你为什么关心呢?以合乎逻辑的方式编写源代码,以便维护它的其他人(或几个月后的您)知道您打算做什么。只有当您有可衡量的性能问题时,您才应该尝试超越编译器。
这可能适用于占用寄存器或堆栈空间的低级语言,但在高级托管语言中,这些都不是大问题。
推荐阅读
- java - 线程“主”java.util.NoSuchElementException ReadingFiles 中的异常
- azure - Cosmos DB SDK v3 中的首选位置
- ubuntu - 如何使用通配符打开端口?
- python - 在 python pandas 中使用 .pivot 时出现关键错误
- python - Python:创建一个字典,其中键有多个值
- ios - Ionic 4 - innerHTML 内的链接在 ios 上不起作用
- assembly - movzx 和 cwd - 它们可以互换吗?
- r - 计算固定效应 logit 的混淆矩阵
- c - SDL2 不呈现多个视口
- c# - ADFS 与 SAML2.0 WebSSO 协议。签名认证失败