.NET Jitter可以优化While XmlReader.Read循环吗?

时间:2012-06-08 05:09:48

标签: asp.net .net jit xmlreader

我问了一个单独的问题(现已删除),我认为实际问题是什么。

.NET Jitter是否真的不能执行此循环:

Private Shared Sub CheckXmlValidity(ByVal textReader As System.IO.StreamReader)
  Try
    ' Check for "interesting" xml documents.
    Dim settings = New System.Xml.XmlReaderSettings()
    settings.XmlResolver = Nothing
    settings.MaxCharactersInDocument = 655360
    ' Successfully parse the file, otherwise an XmlException is to be thrown.
    Dim reader = System.Xml.XmlReader.Create(textReader, settings)
    Try
      While reader.Read()
        'Just checking.
      End While
    Finally
      reader.Close()
    End Try
  Catch ex As Exception
    Throw New HttpException(500, "Invalid Xml data", ex)
  End Try
End Sub

我希望不完全是因为可以引发异常的副作用,但我只是在检查......

1 个答案:

答案 0 :(得分:3)

JITer,实际上是任何优化器,只能删除对问题执行没有影响的项目。证明一种方法没有效果在.Net中很难做到。特别是因为如果源对象是null(它会抛出异常),每个方法调用都会产生影响。因此,如果没有插入null种类检查(1)

,即使已知的方法也是无法完全删除的无操作方法。

在这种情况下,XmlReader.Read是未密封类型的abstract方法,这种方法更难。如果JITer知道XmlReader.Read的每个实现都是无操作,那么它只能删除此调用,因此无效。它不可能知道这一点,因为XmlReader的派生数不是固定集。可以随时使用XmlReader的新派生来加载新的DLL,其具有有意义的定义,因此无法进行优化。

(1)注意:我不是说JITer会这样做,只是如果它删除了方法,则需要进行某种形式的null检查。