1

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

.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

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

4

1 回答 1

3

JITer,实际上是任何优化器,只能删除对问题执行没有影响的项目。在 .Net 中很难证明一种方法没有效果。特别是因为如果源对象是,每个方法调用都会产生影响null(它会抛出异常)。因此,即使是已知为无操作的方法也无法在不插入null排序检查的情况下完全删除 (1)

在这种情况下XmlReader.Read,是一种abstract更难的非密封类型的方法。XmlReader.Read只有当 JITer 知道 的每个实现都是空操作并因此无效时,它才能删除此调用 。但它永远无法知道这一点,因为 的推导数XmlReader不是一个固定的集合。一个新的 DLL 可以在任何时候加载,它的新派生XmlReader具有有意义的定义,因此不能被优化掉。

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

于 2012-06-08T05:15:40.410 回答