c# - JIT简单优化

标签 c# .net optimization jit

我有以下方法

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
}

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

  1. JIT 会自动执行类似于第二个示例的操作
  2. 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/

相关文章:

c# - 在 C# 中使用 POST/httpwebrequest 上传 zip 文件

ruby-on-rails - has_many/has_one :through makes N+1 queries in some cases, 使用委托(delegate)代替?

c - 这会导致堆栈出现问题吗?

C# 查找数组中只出现一次的单词

c# - 在 ML.net 中发布训练模型。从 TaxiFareExample 更改模型的问题。 'Features' 必须是 R4 的已知大小向量,但类型为 : Vec<I4, 2>

c# - 在 C# 代码中管理存储过程的最佳实践是什么?

.net - guid 的安全性是否值得信任,或者如果可以强制系统生成许多已知的 guid,它们是否可以预测?

.net - 如何让辅助角色应用程序访问Web角色实例中的文件

.net - 什么是 Azure 和 .NET 服务?与 WCF 服务有关联吗?

unit-testing - 为单元测试优化一个类是好的做法,还是为时过早?