我有以下方法
void DoSome(){
if (int.Parse(SomeStringProperty) > 8)
// do something
if (int.Parse(SomeStringProperty) < 10)
// do something
}
JIT 是否知道保留解析后的值,还是最好执行以下操作:
void DoSome(){
var x = int.Parse(SomeStringProperty);
if (x > 8)
// do something
if (x < 10)
// do something
}
我在这里可以看到两个优化:
- JIT 会自动执行类似于第二个示例的操作
- JIT 进行一次优化并缓存结果
我的问题只是关于需要保持一致的一个优化,而不是关于可能取决于很多因素的 2 个优化。
简而言之,当我编写 C# 应用程序时,上述示例中的哪些是首选?
更新
如果答案不是,为什么它与此不同:
foreach (var x in MyMethod.GetEnumeration())
这里不需要做:
var lst = MyMethod.GetEnumeration();
foreach (var x in lst)
最佳答案
在一般情况下,不会。因为:副作用。通常,any.Method(args)
可以每次 做一些不同的事情(记录、随机性、递增计数器、连接到外部非托管资源等),并且必须每次调用以保留原始语义。 可能是维护了一个“纯”函数的白名单,但我想不出有什么特别的理由将 int.Parse
包含在其中。
基本上,如果您想吊起它:自己吊起。你的第二个例子中的代码是合理的(我个人会添加一个else
,即else if
)。
此外:您的示例多次调用 SomeStringProperty
:that too 必须多次调用以保留语义,并且可能会有不同的行为。
最后,在多线程世界中,字段本身可能会发生变化。
关于c# - JIT简单优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20323755/