首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JIT简单优化

JIT简单优化
EN

Stack Overflow用户
提问于 2013-12-02 08:26:52
回答 2查看 155关注 0票数 2

我有以下方法

代码语言:javascript
运行
复制
void DoSome(){
    if (int.Parse(SomeStringProperty) > 8)
        // do something

    if (int.Parse(SomeStringProperty) < 10)
        // do something
}

JIT是否知道保留解析的值,或者更好地执行以下操作:

代码语言:javascript
运行
复制
void DoSome(){
    var x = int.Parse(SomeStringProperty);
    if (x > 8)
        // do something

    if (x < 10)
        // do something
}

有两个优化的我可以在这里看到:

  1. JIT将自动执行类似于第二个示例的操作
  2. JIT执行一次优化并缓存结果。

我的问题只是一个优化,它需要是一致的,而不是关于2优化,可以取决于许多因素。

简而言之,当我编写C#应用程序时,最好使用上述示例中的哪些?

更新

如果答案不是,为什么它与此不同:

代码语言:javascript
运行
复制
foreach (var x in MyMethod.GetEnumeration())

这里没有必要这样做:

代码语言:javascript
运行
复制
var lst = MyMethod.GetEnumeration();
foreach (var x in lst)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-02 08:29:37

一般情况下不是。因为:副作用。通常,any.Method(args)可以在每次(日志记录、随机性、递增计数器、连接到外部非托管资源等)时执行不同的,并且必须每次调用才能保留原始语义。可能是维护了“纯”函数的白名单,但我想不出有什么特别的理由在其中包括int.Parse

基本上,如果你想要提升它,那就是你自己去提升它。第二个示例中的代码是合理的(就我个人而言,我会添加一个else,即else if)。

此外:您的示例多次调用SomeStringProperty:表示,要保留语义,必须多次调用must ,并且行为可能有所不同。

最后,在多线程世界中,字段本身可能已经改变了。

票数 8
EN

Stack Overflow用户

发布于 2013-12-02 09:07:54

关于更新:该示例完全不相关。你不妨举个例子:

代码语言:javascript
运行
复制
var val = MyMethod.SomeMethod();

并将其与以下方面进行比较:

代码语言:javascript
运行
复制
var tmp = MyMethod.SomeMethod();
var val = tmp;

在这两种情况下,您所做的就是通过赋值的方式将调用/计算与使用分离为一个中间变量。而且,在这两种情况下,如果我们假设lst / tmp变量不在其他地方使用,那么我们可以合理地确定编译器(而不是JIT)实际上删除了这个变量--所以这两个变量不仅在逻辑上是等价的,而且实际上是等价的。在这个场景中,我们没有删除任何方法调用等等--我们只计算了一次。完全不相关的情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20323755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档