我有以下方法
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
}
有两个优化的我可以在这里看到:
我的问题只是一个优化,它需要是一致的,而不是关于2优化,可以取决于许多因素。
简而言之,当我编写C#应用程序时,最好使用上述示例中的哪些?
更新
如果答案不是,为什么它与此不同:
foreach (var x in MyMethod.GetEnumeration())
这里没有必要这样做:
var lst = MyMethod.GetEnumeration();
foreach (var x in lst)
发布于 2013-12-02 08:29:37
一般情况下不是。因为:副作用。通常,any.Method(args)
可以在每次(日志记录、随机性、递增计数器、连接到外部非托管资源等)时执行不同的,并且必须每次调用才能保留原始语义。可能是维护了“纯”函数的白名单,但我想不出有什么特别的理由在其中包括int.Parse
。
基本上,如果你想要提升它,那就是你自己去提升它。第二个示例中的代码是合理的(就我个人而言,我会添加一个else
,即else if
)。
此外:您的示例多次调用SomeStringProperty
:表示,要保留语义,必须多次调用must ,并且行为可能有所不同。
最后,在多线程世界中,字段本身可能已经改变了。
发布于 2013-12-02 09:07:54
关于更新:该示例完全不相关。你不妨举个例子:
var val = MyMethod.SomeMethod();
并将其与以下方面进行比较:
var tmp = MyMethod.SomeMethod();
var val = tmp;
在这两种情况下,您所做的就是通过赋值的方式将调用/计算与使用分离为一个中间变量。而且,在这两种情况下,如果我们假设lst
/ tmp
变量不在其他地方使用,那么我们可以合理地确定编译器(而不是JIT)实际上删除了这个变量--所以这两个变量不仅在逻辑上是等价的,而且实际上是等价的。在这个场景中,我们没有删除任何方法调用等等--我们只计算了一次。完全不相关的情况。
https://stackoverflow.com/questions/20323755
复制相似问题