【发布时间】:2011-02-24 22:17:11
【问题描述】:
我有一个如下所示的扩展方法:
//[MethodImpl(MethodImplOptions.NoOptimization)]
public static IEnumerable<char> TakeWhile(this BinaryReader reader, Func<int, bool> condition)
{
while (condition(reader.PeekChar()))
{
char c = reader.ReadChar();
yield return c;
}
}
我在使用 BinaryReader 解析文件时使用此方法来跳过空白字符块等。我发现当我这样称呼它时,JIT 编译器正在对其进行优化:
// Skip white space
this.reader.TakeWhile(IsWhiteSpace);//.FirstOrDefault();
我尝试添加 [MethodImpl(...)] 属性来指示 JIT 编译器不要优化该方法,但它不起作用。现在显然我可以编写另一个实现它来操纵底层流缓冲区的位置,但出于好奇,我想知道为什么会这样。
我发现阻止优化的唯一方法是使用 IEnumerable 结果(例如 - 通过调用 .FirstOrDefault() 如上所述)或将代码复制到调用方法中。我曾尝试使用 MethodImplAttribute 阻止优化调用方法,但这不起作用。奇怪的是,优化在 Debug 构建下完全关闭,因此在任何情况下都不应该发生。有谁知道阻止优化的另一种方法?
【问题讨论】:
-
只是好奇,您是如何确定它正在被优化的?
标签: c# .net optimization iterator jit