C#结合回报报表的优化

C#结合回报报表的优化,c#,compilation,compiler-optimization,C#,Compilation,Compiler Optimization,我已经使用Visual Studio在C#中编写了一个函数,并决定查看在启用“优化代码”构建标志的情况下编译时的效果 我用dnSpy检查了DLL,注意到if语句已被删除。这导致每次调用函数时都会访问nexter.data数组,这正是我试图避免的 以下是Visual Studio中的函数: [MethodImpl(MethodImplOptions.AggressiveInlining)] protected bool DrawFaceXNegative(int j, int k, int chu

我已经使用Visual Studio在C#中编写了一个函数,并决定查看在启用“优化代码”构建标志的情况下编译时的效果

我用dnSpy检查了DLL,注意到if语句已被删除。这导致每次调用函数时都会访问nexter.data数组,这正是我试图避免的

以下是Visual Studio中的函数:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected bool DrawFaceXNegative(int j, int k, int chunkPosition, Chunk neighbour)
{
    // These two if statements are here to prevent an array access if possible
    if (chunkPosition == 0)
        return false;

    if (neighbour == null)
        return true;

    return neighbour.data[31 * Constants.ChunkSize + j + k * Constants.ChunkSizeSquared].index == 0;
}
以下是dnSpy中的函数:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected bool DrawFaceXNegative(int j, int k, int chunkPosition, Chunk neighbour)
{
    return chunkPosition != 0 && (neighbour == null || neighbour.data[992 + j + k * 1024].index == 0);
}
将逻辑更改为if-else语句会产生相同的结果。有没有办法防止这种优化发生

作为一个附带问题,是什么让编译器相信生成的函数得到了更好的优化

return chunkPosition != 0 && ...
做的事情和

  if (chunkPosition == 0)
        return false;
如果chunkPosition为0,则它:

  • 根据&&规则停止其余的计算
  • 它返回false
  • 如果此部分的计算结果为true,则返回值将为
    true&(nexter==null | | nexter.data[992+j+k*1024]。index==0)-所以不管省略的结果是什么

    &&连接的东西被执行,直到你点击第一个false

    ||连接的东西被执行,直到你达到第一个真


    如果您希望所有代码始终执行,我认为单字符版本就是您要寻找的droid。

    据我所知,它只是在生成IL的字节数方面更为优化,性能将是相同的。您能澄清一下吗“这导致每次调用函数时都会访问nexter.data数组”?正如@BradleySmith所说的代码完全相同,反编译器可能只是得到了IL->C#转换,而不是您喜欢的方式。比较“优化”的IL“并调试要确认的方法的生成。您的代码使用
    chunkPosX
    而不是
    chunkPosition
    。我认为这是一个复制错误“…这导致每次调用函数时都会访问nexter.data数组…”-你怎么会这样认为?只有当
    chunkPosition!=0&&(nexture==null
    @MickyD根据Christopher的回答,我不知道如果条件的第一部分为false,其余的&&计算将停止。谢谢大家的评论谢谢,我不知道&&规则会导致其余的计算停止。