c#:这段代码会得到优化吗?

标签 c# compiler-optimization

我在审查第三方外包公司提供给我们的一些代码时遇到了这个小 gem :

try
{
    int i = strOriginalData.IndexOf("\r\n");
    ////System.Diagnostics..EventLog.WriteEntry("i", i.ToString());
}
catch (System.Exception ex)
{
    ////System.Diagnostics..EventLog.WriteEntry("ex", ex.Message);
}

我的问题是编译器会完全优化它吗?当我在 Reflector 中查看编译后的程序集时,它显示如下:

try
{
    i = this.strOriginalData.IndexOf("\r\n");
}
catch (Exception exception1)
{
    ex = exception1;
}

i 的声明已移至方法的顶部,Exception 类型的附加声明也位于方法的顶部。

因此,由于这段代码实际上没有做任何事情,我想知道编译器是否足够聪明,可以看到这段代码什么也没做,并可以优化它。

最佳答案

因此,正如您通过 Reflector 发现的那样,C# 编译器 不会优化它。 JIT 编译器 是否会是另一个问题。但是,我想答案几乎肯定不是。

为什么?因为 JIT 编译器不知道 IndexOf 是一个无聊的方法。换句话说,就 JIT 编译器所知,string.IndexOf 可以定义为

public int IndexOf()
{
   CallAWebService();
}

显然,在那种情况下优化掉那条线是不好的。

关于c#:这段代码会得到优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4337827/

相关文章:

c++ - 优化的 clang 处理溢出

c++ - C++ 编译器如何优化堆栈分配?

objective-c - 为什么 Xcode/LLVM 在为 ARM64 编译时优化此方法返回的变量

c# - ExecuteNonQuery 需要一个打开且可用的连接。连接的当前状态是关闭的

c# - 将随机颜色绑定(bind)到列表框的项目

c# - 如何使用 LINQ to XML 接收列表格式的数据

c# - 在 C# 中使用隐式类型的可空变量?

C++ 虚函数 : Can the linker remove entries in the virtual function table which aren't called?

performance - intel -03会将成对的__m256d指令转换为__m512d

c# - Telnet 服务器如何与客户端通信?