C#结合回报报表的优化
我已经使用Visual Studio在C#中编写了一个函数,并决定查看在启用“优化代码”构建标志的情况下编译时的效果 我用dnSpy检查了DLL,注意到if语句已被删除。这导致每次调用函数时都会访问nexter.data数组,这正是我试图避免的 以下是Visual Studio中的函数: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
[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,则它:
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,其余的&&计算将停止。谢谢大家的评论谢谢,我不知道&&规则会导致其余的计算停止。