C# 优化组合 Return 语句
C# Optimisation Combining Return Statements
我使用 Visual Studio 在 C# 中编写了一个函数,并决定查看在启用 'optimize code' 构建标志的情况下进行编译时的效果。
我用 dnSpy 检查了 DLL,发现 if 语句已被删除。这导致每次调用函数时都访问 neighbour.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的情况下:
- 根据 && 规则停止剩余的计算
- 它return是假的
如果这部分的计算结果为真,return 值将是 true && (neighbour == null || neighbour.data[992 + j + k * 1024].index == 0);
- 所以无论省略号的结果如何。
&& 连接的东西被执行,直到你遇到第一个 false。
||连接的东西被执行,直到你命中第一个 true。
如果你想让所有的代码一直执行,我想单字符版就是你要找的droid
我使用 Visual Studio 在 C# 中编写了一个函数,并决定查看在启用 'optimize code' 构建标志的情况下进行编译时的效果。
我用 dnSpy 检查了 DLL,发现 if 语句已被删除。这导致每次调用函数时都访问 neighbour.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的情况下:
- 根据 && 规则停止剩余的计算
- 它return是假的
如果这部分的计算结果为真,return 值将是 true && (neighbour == null || neighbour.data[992 + j + k * 1024].index == 0);
- 所以无论省略号的结果如何。
&& 连接的东西被执行,直到你遇到第一个 false。
||连接的东西被执行,直到你命中第一个 true。
如果你想让所有的代码一直执行,我想单字符版就是你要找的droid